JCL Utilities 
Quick Reference

INDEX

IEFBR14	6
·	Delete files	6
·	Allocate new flat files	6
·	BSLBR14	7
IEBGENER	8
·	General structure	8
·	IEBGENER Control Statements:	8
·	Copy datasets	11
·	Concatenate datasets	11
·	Empty existing files	11
·	Allocate empty files	11
·	Create a PDS from sequential dataset	12
·	Copy CMS file to disk having data in first 35 characters	12
·	Copy file to disk after inserting an identifier	12
ICEGENER	13
·	General structure	13
IEBCOMPR	14
·	General structure	14
·	Compare 2 PSDSs that reside on 9-track tape volumes	14
·	Compare 2 PSDSs that reside on 7-track tape volumes	15
·	Compare 2 PSDSs residing on different density tape volumes	15
·	Compare two partioned datasets	16
·	Compare two PDSEs	16
·	IEBCOMPR return codes:	17
FILECOMP	18
·	General syntax	18
·	List of control cards	18
IEBCOPY	22
·	COPY	22
·	SELECT	23
·	EXCLUDE	23
·	JCL to compress a PDS	23
·	JCL to unload a PDS to a tape	24
·	JCL to load a PDS to DASD from a sequential unloaded copy	24
·	JCL to copy 4 members from one PDS to another	24
IDCAMS	25
·	Uncatalog files	25
·	Delete files	26
·	Copy data	26
·	Allocate vsam files/indexes	27
·	Copy a sequential file to vsam & define alternate index	28
·	Build alternate index from base cluster	28
·	Define GDG base	29
COMPAREX	30
FILEAID	32
·	General Structure	32
·	Check for empty files	32
·	Copy dataset - one to one	32
·	Copy dataset - many to many	33
·	Conditional copy	33
·	Using pointer mechanism	34
·	Replace	34
·	Edit	35
·	Accumulation and tallying	36
·	Backward processing of records	36
·	User functions - split input file	36
FASTDEL	38
SORT	39
·	General structure	39
·	INCLUDE	40
·	INREC:	42
·	MERGE:	43
·	OMIT:	43
·	OUTFIL:	43
·	OUTREC:	44
·	COPY:	45
·	SORT:	45
·	SUM:	46
·	END:	46
·	Simple sort of input file data	46
·	Simple sort and summation of particular field	47
·	Sort and copy selective data	47
·	Change data throughout file	47
·	Selective sort, duplicate removal and data modification	47
·	Start copying after specified records	47
·	Stop copying after specified records	48
GDG	49
·	Define GDG base and create empty version	50
·	Delete all existing versions of GDG	51
·	Delete GDG versions as well as base	51
NDM	52
·	Mainframe to mainframe file transfer:	52
·	Mainframe to Unix file transfer:	52
·	Run task on mainframe:	52
·	Run shell script on Unix	53
·	Run an AppWorx module in Unix if copy step is successful	53
XCOM	55
·	Control cards syntax	55
·	Mainframe to mainframe file transfer	56
·	Mainframe to mainframe report transfer	56
FTP	57
REXEC	59
·	Execute ls command on Unix from TSO session	59
·	Execute shell script on Unix from mainframe in batch mode	60
·	REXEC return codes	60
Appendix	62
·	Appendix I : Signed number to normal number conversion chart	62
·	Appendix II : 3390 Device characteristics	63
·	Appendix III : Computational items	64

IEFBR14 

IEFBR14 is an IBM utility module that performs two simple functions:

1.	It loads register 15 with a value of 0
2.	It then does a branch to the address in register 14

Since register 14 is the standard IBM program linkage "return address" register, this immediately returns control to the calling program.  And since register 15 is the standard IBM program linkage "return code" register, the return code passed back to the calling program is always 0.

If the calling program is an application program which calls IEFBR14 according to standard IBM program linkage conventions, then IEFBR14 acts as a subroutine which immediately returns to the calling program and always passes back a return code of 0.  In other words, it functions as a subroutine "stub" which can be useful in some testing situations.

If IEFBR14 is executed as a standalone batch program; i.e.,

//JS10   EXEC PGM=IEFBR14

then it provides a convenient way to insert a job step into a given job which is guaranteed to set a return code of zero.  This job step can also be used to catalog or delete specified data sets from within a batch job. 

•	Delete files 

//STEPDEL1 EXEC PGM=IEFBR14
//DD1      DD DSN=G1SG00AT.FINENAME,         
//         DISP=(MOD,DELETE,DELETE), 
//         UNIT=SYSDA,SPACE=(TRK,0) 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY

Note: If the data set is cataloged, the user should not code UNIT or VOL=SER parameters. If these are coded, the data set will be deleted but not uncataloged. IEFBR14 should not be used to catalog or uncatalog tape data sets, since to do so requires mounting the tape. IEHPROGM should be used for these purposes. 

Index
•	Allocate new flat files 

//STEPALL1 EXEC PGM=IEFBR14,
//DD1      DD DSN=G1SG00AT.NEWFINE,         
//         DISP=(NEW,CATLG,DELETE), 
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY

•	BSLBR14

BSLBR14 is an alternative to IEFBR14. It functions much the same way as IEFBR14 with some notable exceptions:

1.	BSLBR14 will wait before execution
2.	BSLBR14 can be made to issue any message 
3.	BSLBR14 can return any condition code or any ABEND code.

It should be noted that, at the moment, BSLBR14 is not Re-Entrant and should not be used as a total replacement for IEFBR14. IEFBR14 may also used as a 'dummy' routine by many other system modules, therefore BSLBR14 should never be used as a complete replacement for IEFBR14. 

The program is mostly controlled by means of parameters passed to it on the JCL EXEC card. The only exception to this is for issuing messages. These are read from the SYSIN DD JCL card. There is no checking for the contents of the messages, nor is there a limit placed on the number of messages that can be issued.

There are 3 keywords for the passed parameters, they can appear in any order and are explained in detail below:

WAIT=nnnn : Causes BSLBR14 to wait for the specified number of seconds before it terminates with either the desired condition code or the desired ABEND code. This parameter must be numeric and may be up to 3 digits in length only. Leading zeros may be omitted. The default wait time is 20 seconds.

RC=nn : Determines the return code that will be produced by this execution of BSLBR14. The value of this parameter must be numeric and may be up to 2 digits in length only. The default return code is 00.

ABEND=ccccc : Determines the ABEND code that this execution of BSLBR14 terminate with. The ABEND code can be either a U for a user ABEND or a S for a system ABEND. i.e. U0099 will cause BSLBR14 to terminate with a user 99 ABEND. SB37 will cause BSLBR14 to terminate with a system B37 ABEND. The first character of this parameter must be either U or S. The value following the ABEND type may be up to a maximum of 4 digits. These digits MUST be either numeric or the letters A through to F. If the ABEND code supplied is syntactically invalid a default of U0001 will be used. The code specified need not be a valid IBM ABEND code. No checking is performed for the validity of the system ABEND code. By default BSLBR14 will not ABEND.

If you foul up on ANY of the parameters then the defaults will be used these are RC=0,WAIT=20

Index

IEBGENER 

IEBGENER is a generalized copy utility used to perform the following tasks:

1.	Produce a backup copy of a sequential data set, or a member of a PDS or PDSE
2.	Produce a PDS or PDSE, or a member of either, from a sequential file
3.	Produce an "edited" sequential data set, PDS, PDSE, or a member in either
4.	Handle double-byte character set data DBCS data
5.	Produce printed list of either sequential data sets or PDS/PDSE members 
6.	Re-block a data set or change its logical record length
7.	Provide exit or editing capabilities for label processing, input data editing, key creation, or permanent I/O error processing.

•	General structure

//JS10    EXEC PGM=IEBGENER,REGION=1024K
//SYSPRINT DD SYSOUT=*                 
//SYSUT1   DD DSN=...,DISP=...         
//SYSUT2   DD DSN=...,DISP=...         
//SYSIN    DD *                        
 control statements...
/*

Here:

SYSPRINT DD statement is required and must have RECFM=FB or F. The BLKSIZE value can be any value up to 32670 that is a multiple of 121.

SYSUT1 DD statement points to the input file for the IEBGENER operation.  This file can be RECFM=F, FB, V, VS, VB, VBS, or U.  The BLKSIZE must be specified in the data set label or via JCL.  Variable Spanned (RECFM=VS or VBS) records cannot be copied to the output file if the output file is a PDS or PDSE.

SYSUT2 DD statement points to the output file for the IEBGENER operation.  This file can be RECFM=F, FB, V, VS, VB, VBS, or U.  PDS or PDSE libraries cannot have a RECFM of VS or VBS.  Reblocking is accomplished if the SYSUT2 BLKSIZE is a new maximum blocksize.  RECFM must be specified for the SYSUT2 file if the data set is new or DUMMY.  BLKSIZE must always be specified for the SYSUT2 DD statement if LRECL and RECFM are also specified.

SYSIN DD specifies control statements. This can be on DASD, TAPE or in-stream data. The SYSIN block size must be multiple of 80, with a maximum allowed BLKSIZE of 32,720, and a RECFM of F or FB.

•	IEBGENER Control Statements:

Valid control statements are GENERATE, EXITS, LABELS, MEMBER, and RECORD.  Control statements are continued by placing a non-blank character in column 72, and continuing the statement beginning in column 16 on the next statement.  The syntax and usage of each is discussed below:

GENERATE:

The GENERATE control statement is required when:

1.	The output data set is partitioned, or
2.	Editing is to be performed, or
3.	User routines are provided and/or label processing is to be done.

The format of the GENERATE statement is:

{label}    GENERATE MAXNAME=n
           {,MAXFLDS=n}
           {,MAXGPS=n}
           {,MAXLITS=n}
           {,DBCS={YES ¦ NO}}

The MAXNAME, MAXFLDS, MAXGPS, and MAXLITS parameters set limits on the number of member names, FIELDS, IDENTS, and character literals that will follow on subsequent RECORD and MEMBER statements. If you use the GENERATE statement, make sure these four parameters are set to high enough values. Use DBCS=YES whenever the input file has double-byte character set data included.

RECORD:

The RECORD statement defines a record group and provides editing directions to IEBGENER.  The RECORD control statement is required when:

1.	The output data set is partitioned, or
2.	Editing is to be performed, or
3.	User routines are provided and/or label processing is to be done.

In a RECORD statement, one IDENT parameter can be used to identify a record group, one or more FIELD parameters can be used to describe editing to be done on records in the record group, and a LABELS parameter can be used to indicate that this statement is immediately followed by user label records. The format of the RECORD statement is:

{label} RECORD {{IDENT¦IDENTG}=(length,'name',input-location)}
                {,FIELD=({length}
                         {,input-location ¦ 'literal'}
                         {,conversion}
                         {output-location}),{FIELD=...}
                {,LABELS=n}

The variables on the FIELDS= parameter are positional; if any of the options are not coded, the associated comma preceding that variable must be coded.

The {IDENT¦IDENTG}= parameter identifies the last record of the input group to which the FIELD parameters apply. IDENT is used for single-byte character string, and IDENTG for double-byte character strings (DBCS).  The last record is identified by the literal given by 'name', which must have the given length and input location relative to 1.  Use X'name' for hexadecimal names.

The FIELD= parameter supplies field-processing and editing information. 'Length' and 'input-location' identify a field to be processed, 'literal' is a literal value to be placed in the specified 'output-location', and 'conversion' is either CG (shift-out/shift-in characters removed no DBCS validation), CV (DBCS validation and input contains both single and double-byte character set data),  GC (shift-in/shift-out characters inserted for DBCS data),  GV (DBCS data not in shift-in/shift-out characters and data validation),  HE (H-set BCD data converted to EBCDIC),  PZ (packed to zoned),  VC (DBCS validation and data not in shift-in/shift-out characters),  VG (DBCS data validation and eliminate shift-in/shift-out characters), or ZP (zoned to packed). Use X'literal' for hexadecimal literal values.

LABELS= (optional) is a number from 1 to 8 that identifies the number of records in the SYSIN stream to treat as user label records. DATA=INPUT on a LABELS statement must precede it in the input stream.

MEMBER:

The MEMBER statement is used when the output data set is to be a PDS/PDSE. One MEMBER statement must be included for each member being created.  All RECORD statements that follow a MEMBER statement refer to the member named by that statement.  If a MEMBER statement is not included, the output data set will be sequential.  The format of the MEMBER statement is:

{label}   MEMBER NAME=(name{,alias}...)

'name' and 'alias' are member names and aliases desired for the ember.  Multiple aliases are allowed.

LABELS:

The LABELS statement indicates the disposition of user labels hen processed by IEBGENER.  LABELS should be specified when:

1.	User labels are not to be copied to the output data set, or
2.	Retrieved user labels from records in the data portion of the SYSIN data set, or
3.	The user's exit routine is invoked before the user labels are copied to the output data set.

If multiple LABELS statements are present, only the last one encountered is used.  The format of the LABELS statement is:

{label}   LABELS {DATA=YES¦NO¦ALL¦ONLY¦INPUT}

DATA=YES is the default. "YES" means that if the user labels are not rejected by your user label exit module, they will be processed as data.  "NO" means, do not process user labels as data.  "ALL" means, treat all user labels in the current group being processed as data.  "ONLY" means,  treat header labels only as data.  "INPUT" means, that user labels for the output data set are to be copied from the data part of the SYSIN data set, and the number of records to read is specified in the RECORD statement.

EXITS:

The EXITS statement provides that names of user exit routines to be used in processing user labels. The format of the EXITS statement is:

Format -

{label}   EXITS {INHDR=routinename}
                {,OUTHDR=routinename}
                {,INTLR=routinename}
                {,OUTTLR=routinename}
                {,KEY=routinename}
                {,DATA=routinename}
                {,IOERROR=routinename}
                {,TOTAL=routinename,size}

The EXITS statement provides the names of the exit routines to be user for the function identified above.  Usage of all of these exits is optional.  'INHDR' identifies the input header exit routine. 'OUTHDR' identifies the output header exit routine. 'INTLR' identifies the input trailer exit routine. 'OUTTLR' identifies the output trailer exit routine. 'KEY' identifies the output create record key exit routine, not invoked for LRECL VS or VBS records. 'DATA' identifies the pre processing record exit routine. 'IOERROR' identifies the permanent I/O error exit routine. 'TOTAL' identifies the pre record output exit routine, where "size" is a decimal number identifying the bytes required for processing.

IEBGENER usage examples
•	Copy datasets

//STEPCOPY EXEC PGM=IEBGENER
//SYSUT1   DD DSN=G1SG00AT.OLDFILE1,DISP=SHR
//SYSUT2   DD DSN=G1SG00AT.NEWFILE,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY
Index

•	Concatenate datasets 

//STEPCONC EXEC PGM=IEBGENER
//SYSUT1   DD DSN=G1SG00AT.OLDFILE1,DISP=SHR
//         DD DSN=G1SG00AT.OLDFILE2,DISP=SHR
//         DD DSN=G1SG00AT.OLDFILE3,DISP=SHR
//SYSUT2   DD DSN=G1SG00AT.NEWFILE,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY
Index

•	Empty existing files

//STEPEMPT EXEC PGM=IEBGENER
//SYSUT1   DD DUMMY,
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SYSUT2   DD DSN=G1SG00AT.EMPTFILE,
//         DISP=(OLD)
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY
Index

•	Allocate empty files

//STEPEMPT EXEC PGM=IEBGENER
//SYSUT1   DD DUMMY,
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SYSUT2   DD DSN=G1SG00AT.EMPTFILE,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY
Index
•	 Create a PDS from sequential dataset

//CREATPDS EXEC PGM=IEBGENER
//SYSUT1   DD DSN=MY.SEQ.FILE.LIB,DISP=SHR
//SYSUT2   DD DSN= MY.PDS.FILE.LIB,DISP=SHR 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
GEN1  GENERATE MAXNAME=4,MAXGPS=3
MEM1  MEMBER  NAME=JOBCARD
GRP1  RECORD   IDENT=(8,'//* NJOB',1),
MEM2  MEMBER  NAME=JESCARDS
GRP2  RECORD   IDENT=(8,'//* NJES',1),
MEM3  MEMBER  NAME=JCLCARDS
GRP3  RECORD   IDENT=(7,'* TOP *',1),
MEM4  MEMBER  NAME=RPTDATA
GRP4  RECORD   IDENT=(8,'*BOTTOM*',1)
Index

•	Copy CMS file to disk having data in first 35 characters

//COPYSTEP EXEC PGM=IEBGENER
//SYSUT1   DD DSN=<file to be copied>,DISP=SHR
//SYSUT2   DD DSN=<target file name>,DISP=OLD 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  GENERATE MAXFIELDS=1
  RECORD FIELDS=(35,1,,1)
Index
•	Copy file to disk after inserting an identifier

//COPYSTEP EXEC PGM=IEBGENER
//SYSUT1   DD DSN=<file to be copied>,DISP=SHR
//SYSUT2   DD DSN=<target file name>,DISP=OLD 
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  GENERATE MAXFIELDS=2,MAXLITS=7
  RECORD FIELDS=(7,'USC1280',,1),FIELD=(80,1,,8)

Index

ICEGENER

ICEGENER is a DFSORT feature that could not be easier to use, yet provides excellent performance improvements as a replacement for IEBGENER. A special application of ICEGENER replacing IEBGENER is where the output data set's record length does not match that of input data set. Everything is same in terms of syntax as compared to IEBGENER.

ICEGENER uses DFSORT to process IEBGENER jobs when possible and transfers control to IEBGENER when DFSORT can’t be used. Most IEBGENER jobs that use DUMMY for SYSIN can be processed by DFSORT, resulting in significant performance improvements. As an added benefit, DFSORT issues messages containing useful information such as the number of records copied and the RECFM, LRECL, and BLKSIZE of the SYSUT1 and SYSUT2 data sets. 

In some cases IEBGENER cannot copy a SYSUT1 data set to a SYSUT2 data set with a different logical record length. ICEGENER normally copies such data sets by padding or truncating the records, issuing an accompanying warning message and return code 0. However, ICEMAC installation options GNPAD and GNTRUNC can be used to have ICEGENER issue a return code 4 or even transfer control to IEBGENER when the SYSUT1 and SYSUT2 logical record lengths are different.

•	General structure

//STEPCOPY EXEC PGM=ICEGENER
//SYSUT1   DD DSN=G1SG00AT.TEST.FTPIN,DISP=SHR
//SYSUT2   DD DSN=G1SG00AT.OUTFILE.KC,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL,(2,2),RLSE),
//         DCB=(LRECL=10,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DUMMY
Index

If the output data set is lesser in length as compared to input data set, then truncation takes place. If output data set has record length more than that of input data set then fillers are padded (seen as '.' if browsed) at the end of data.

IEBCOMPR

IEBCOMPR is a data set utility used to compare two sequential data sets, two partitioned data sets or two PDSEs at the logical record level to verify a backup copy. Fixed, variable, or undefined records from blocked or unblocked data sets or members can also be compared. However, you should not use IEBCOMPR to compare load modules. 
Two sequential data sets are considered equal, that is, are considered to be identical, if: 
•	The data sets contain the same number of records, and 
•	Corresponding records and keys are identical 

Two partitioned data sets or two PDSEs are considered equal if: 
•	Corresponding members contain the same number of records 
•	Note lists are in the same position within corresponding members 
•	Corresponding records and keys are identical 
•	Corresponding directory user data fields are identical 

If all these conditions are not met for a specific type of data set, those data sets are considered unequal. If records are unequal, the record and block numbers, the names of the DD statements that define the data sets, and the unequal records are listed in a message data set. Ten successive unequal comparisons stop the job step, unless you provide a routine for handling error conditions. 
Load module partitioned data sets that reside on different types of devices should not be compared. Under most circumstances, the data sets will not compare as equal. 
Partitioned data sets or PDSEs can be compared only if all the names in one or both of the directories have counterpart entries in the other directory. The comparison is made on members identified by these entries and corresponding user data. 

•	General structure

//STEPCMPR EXEC PGM=IEBCOMPR
//SYSUT1   DD DSN=G1SG00AT.INPUT1,DISP=SHR
//SYSUT2   DD DSN=G1SG00AT.INPUT2,DISP=SHR
//SYSOUT   DD *
//SYSPRINT DD SYSOUT=*
//SYSIN    DD DUMMY
Index

•	Compare 2 PSDSs that reside on 9-track tape volumes

//STEPCOMP EXEC PGM=IEBCOMPR 
//SYSPRINT DD  SYSOUT=A 
//SYSUT1   DD  DSNAME=SET1,UNIT=tape,LABEL=(,NL), 
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000), 
//             DISP=(OLD,KEEP),VOLUME=SER=001234 
//SYSUT2   DD  DSNAME=SET2,UNIT=tape,LABEL=(,NL), 
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=1040), 
//             DISP=(OLD,KEEP),VOLUME=SER=001235 
//SYSIN    DD  DUMMY 
/*

Here datasets are residing on unlabeled 9 track tape volumes.
Index

•	Compare 2 PSDSs that reside on 7-track tape volumes

//STEPCOMP EXEC PGM=IEBCOMPR 
//SYSPRINT DD  SYSOUT=A 
//SYSUT1   DD  DSNAME=SET1,LABEL=(2,SUL),DISP=(OLD,KEEP), 
//             VOL=SER=001234,DCB=(DEN=2,RECFM=FB,LRECL=80, 
//             BLKSIZE=2000,TRTCH=C),UNIT=tape 
//SYSUT2   DD  DSNAME=SET2,LABEL=(,SUL),DISP=(OLD,KEEP), 
//             VOL=SER=001235,DCB=(DEN=2,RECFM=FB,LRECL=80, 
//             BLKSIZE=2000,TRTCH=C),UNIT=tape 
//SYSIN    DD  * 
  COMPARE  TYPORG=PS 
  LABELS  DATA=ONLY 
/*

SYSUT1 DD defines an input data set, SET1, which resides on a labeled, 7-track tape volume. The blocked data set was originally written at a density of 800 bits per inch (DEN=2) with the data converter on (TRTCH=C). 

SYSUT2 DD defines an input data set, SET2, which is the first or only data set on a labeled, 7-track tape volume. The blocked data set was originally written at a density of 800 bits per inch (DEN=2) with the data converter on (TRTCH=C). 

SYSIN DD defines the control data set, which follows in the input stream. 

COMPARE TYPORG=PS specifies that the input data sets are sequentially organized. 

LABELS DATA=ONLY specifies that user header labels are to be treated as data and compared. All other labels on the tape are ignored.
Index

•	Compare 2 PSDSs residing on different density tape volumes

//STEPCOMP EXEC PGM=IEBCOMPR 
//SYSPRINT DD  SYSOUT=A 
//SYSUT1   DD  DSNAME=SET1,LABEL=(,SUL),DISP=(OLD,KEEP), 
//             VOL=SER=001234,DCB=(DEN=1,RECFM=FB,LRECL=80, 
//             BLKSIZE=320,TRTCH=C),UNIT=tape 
//SYSUT2   DD  DSNAME=SET2,LABEL=(,SUL),DISP=(OLD,KEEP), 
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=640), 
//             UNIT=tape,VOLUME=SER=001235 
//SYSIN    DD  * 
  COMPARE  TYPORG=PS 
  EXITS  INHDR=HDRS,INTLR=TLRS 
  LABELS  DATA=NO 
/*

SYSUT1 DD defines an input data set, SET1, which is the first or only data set on a labeled, 7-track tape volume. The blocked data set was originally written at a density of 556 bits per inch (DEN=1) with the data converter on (TRTCH=C). 

SYSUT2 DD defines an input data set, SET2, which is the first or only blocked data set on a labeled tape volume. In this example, assume SYSUT2 is on a 9-track tape drive. 

SYSIN DD defines the control data set, which follows in the input stream. 

COMPARE TYPORG=PS specifies that the input data sets are sequentially organized. 

EXITS identifies the names of routines to be used to process user input header labels and trailer labels. 

LABELS DATA=NO specifies that the user input header and trailer labels for each data set are not to be compared.
Index

•	Compare two partioned datasets

//STEP1    EXEC PGM=IEBCOMPR 
//SYSPRINT DD  SYSOUT=A 
//SYSUT1   DD  DSNAME=PDSSET1,UNIT=disk,DISP=SHR, 
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000), 
//             VOLUME=SER=111112 
//SYSUT2   DD  DSNAME=PDSSET2,UNIT=disk,DISP=SHR, 
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000), 
//             VOLUME=SER=111113 
//SYSIN    DD  * 
  COMPARE  TYPORG=PO 
/* 

SYSUT1 DD defines an input partitioned data set, PDSSET1. The blocked data set resides on a disk volume. 

SYSUT2 DD defines an input partitioned data set, PDSSET2. The blocked data set resides on a disk volume. 

SYSIN DD defines the control data set, which follows in the input stream. 

COMPARE TYPORG=PO indicates that the input data sets are partitioned.
Index

•	Compare two PDSEs

//STEPCOMP EXEC PGM=IEBCOMPR 
//SYSPRINT  DD  SYSOUT=A 
//SYSUT1    DD  DSN=PDSE1,DISP=SHR 
//SYSUT2    DD  DSN=PDSE2,DISP=SHR 
//SYSIN     DD  * 
  COMPARE TYPORG=PO 
/* 

Because a PDSE must be managed by the Storage Management Subsystem, you need not specify the UNIT or VOLUME parameters. 

SYSUT1 DD and SYSUT2 DD define input PDSEs, PDSE1, and PDSE2. Because no DCB values are specified, the DCB values that were specified in creating the data sets will be used. 

SYSIN DD defines the control data set, which follows in the input stream. 

COMPARE TYPORG=PO indicates that the input data sets are PDSEs.
Index

•	IEBCOMPR return codes:

IEBCOMPR returns a code in register 15 to indicate the results of program execution. The return codes and their meanings are: 

00 (X'00') - Successful completion. 
08 (X'08') - An unequal comparison. Processing continues. 
12 (X'0C') - An unrecoverable error exists for unequal comparison. Utility ends. 
16 (X'10') - A user routine passed a return code of 16 to IEBCOMPR. The utility ends. 

Note: Use the SuperC utility instead of IEBCOMPR. SuperC is part or ISPF/PDF and the High Level Assembler Toolkit Feature. SuperC can be processed in the foreground as well as in batch and its report is more useful. 

Index

FILECOMP

FILECOMP is a multipurpose file comparison utility. The various optional parameters available in FILECOMP provide the user with a file compare utility which can be used in nearly every instance where two files must be compared. 

•	General syntax

//FILECOMP   EXEC PGM=FILECOMP
//SYSPRINT   DD  SYSOUT=*
//SYSUDUMP   DD  SYSOUT=*
//SYSUT1     DD  DSN=ORIGINAL.OUTPUT.FILE,DISP=OLD
//SYSUT2     DD  DSN=TEXT.OUTPUT.FILE,DISP=OLD
//SYSIN      DD  *
<control cards>

The following describes the general control card format:

1.	All coding must begin in column 1 of each control card.
2.	Individual parameters must be separated by a comma.
3.	A space terminates control card processing unless immediately preceded by a comma in which case a continuation card is expected.
Index

•	List of control cards

TYPE 	- This is s mandatory parameter. The TYPE parameter specifies the recording format for both files being compared. The format of the TYPE parameter is

TYPE = {F|V|U}

Where,

F -Indicates both files are fixed format
V -Indicates both files are variable format
U -Indicates both files are undefined format

RECSIZE (optional)- The RECSIZE parameter specifies the logical record length for fixed format files. The format of the RECSIZE parameter is

RECSIZE = {n}

Where,
n -Indicates the record length in the range 1 LE n LE 32760

CSERR (optional)- The CSCERR parameter specifies the number of consecutive error records allowed before the compare operation stops and the run terminates. The format of the CSCERR parameter is

CSCERR = n	default = 25

Where,
n -Indicates the number of consecutive errors in the range 1 LE n LE 9999999

TOTERR (optional)- The TOTERR parameter specifies the number of total error records before the compare operation stops and the run terminates. The format of the TOTERR parameter is

TOTERR = n default = 100

Where,
n -Indicates the number of total errors in the range 1 LE n LE 9999999

OMIT (optional)- The OMIT parameter allows fields within a record to be excluded
from the compare operation. The format of the OMIT parameter is

OMIT = {(p,l/,p,l...,p,l\)}

Where,
p -Indicates the staring position of the field in the range 1 LE p LE 32760
l -Indicates the length of the field 1 LE l LE 32760

Any starting position or length within the given range may be specified but any reference to a field or part of a field outside the length of the current record on either file will be ignored. The OMIT parameter will apply only to the fields which are common to both records being compared.

Specifying a key field or any part of a key field does not affect the proper operation of either the OMIT or KEYFIELD parameters.

When OMIT is not specified the entire record is subject to the compare operation.

The OMIT parameter may be specified only once on the control card(s), but may be continued on more than one card.  The total number or omit field descriptions, (i.e. p, l combinations), must not exceed twenty.

IGNPOS (optional)- The IGNPOS parameter specifies how the compare operation handles positive sign differences in zoned fields. The format of the IGNPOS parameter is

IGNPOS = {Y|N*}

Where,
Y -Indicates ignore (assume equal) positive sign differences in zoned fields
N -Indicates do not ignore positive sign differences

IGNPPS (optional)- The IGNPPS parameter specifies how the compare operation handles positive sign differences in packed decimal fields. The format of the IGNPPS parameter is

IGNPPS = {Y|N*}

Where,
Y -Indicates ignore (assume equal) positive sign differences in packed fields
N -Indicates do not ignore positive sign differences

ZERSPC (optional)- The ZERSPC parameter specifies how the compare operation handles a compare of a zero with a blank. The format of the ZERSPC parameter is

ZERSPC = {Y|N*}

Where,
Y -Indicates zero and blank characters are assumed equal
N -Indicates zero and blank characters are not equal

HEX (optional)- The HEX parameter specifies the format of the SYSLST error list.
The format of the HEX parameter is 
HEX = {Y|N*}

Where,
Y -Indicates the SYSLST error list will be in character and hexadecimal zone/number format
N -Indicates the SYSLST error list will be in character format only

KEYFLD (optional)- The KEYFLD parameter allows sequence checking of both files.  An attempt is made to realign the files when one of the files has missing or additional records. The formats of the KEYFLD parameter are:

Format 1:  KEYFLD = {(p,l/f,\s/,p,l,/f,\s...,p,l,/f,\s)}
Format 2:  KEYFLD = {(p,l,s/,p,l,s...,p,l,s\)/,FORMAT=f\)}

Where,
p -Indicates the starting position of the KEYFLD in the range 1 LE p LE 4092
l -Indicates the length of the field.  Minimum and maximum lengths for each valid field type are specified in the following table

    FIELD TYPE      DATA TYPE   MIN LENGTH      MAX LENGTH
    ----------      ---------   ----------      ----------
    Character           CH          1              256
    Binary              BI          1              256
    Zoned Decimal       ZD          1               18
    Packed Decimal      PD          1               10

f -Indicates the data type (format) of the key field(s). The valid types are explained in the above table.
s -Indicates the sequence of the KEYFLD with the files, either ascending(A) or descending(D).

If, the f (FORMAT) is omitted form a KEYFLD character (CH) is assumed for that field. KEYFLD Format 2 may only be used if all fields are of the same data type. KEYFLD must be specified when using the Format 2 START parameter. The key field(s) may be the object of the OMIT parameter without affecting proper operation of the KEYFLD parameter. The records on both files must be sorted as defined in the KEYFLD parameter or the files may be asigned incorrectly. When the KEYFLD parameter is not specified no attempt is made to realign the files. The KEYFLD parameter may be specified more than once, but the total number of field descriptions (i.e. p, l, f, s combinations) must not exceed twenty.

FULLREC (optional)- The FULLREC parameter allows error records to be printed in full or in part. The format of the FULLREC parameter is

FULLREC = {Y|N*}

Where,
Y -Indicates print error records in full
N -Indicates print only the line(s) in error. A line will print up to 100 characters.  Large records will produce multiple lines depending on the position of errors within the record, the length of the record and the setting of the FULLREC option.

VSAM1 (optional)- The VSAM1 parameter describes the type of VSAM file associated
with SYSUT1.  It is only coded if SYSUT1 is a VSAM file. The format of the VSAM1 parameter is

VSAM1 = {ESDS|KSDS}

Where,
ESDS -Indicates an entry sequence VSAM file
KSDS -Indicates a keyed sequence VSAM file

When VSAM1 is not specified SYSUT1 is assumed to be non-VSAM.

VSAM2 (optional)- The VSAM2 parameter describes the type of VSAM file associated
with SYSUT2.  It is only coded if SYSUT2 is a VSAM file. The format of the VSAM2 parameter is

VSAM2 = {ESDS|KSDS}

Where,
ESDS -Indicates an entry sequence VSAM file
KSDS -Indicates a keyed sequence VSAM file

When VSAM2 is not specified SYSUT2 is assumed to be non-VSAM.

START (optional)- The START parameter allows positioning of files before the
compare operation. The formats of the START parameter are

Format 1  START = {(/SYSUT1=nnnnnnn\,/SYSUT2=nnnnnnn\)}
Format 2  START = {(KEY=|KEYS=}(field1,field2...))}

Where,
nnnnnnn -Indicates the starting record number with a range of 1 to 9,999,999
KEY(S) -Indicates the key values to be used in determining the start of the compare.  Fields must be in the same sequence as defined in the KEYFLD parameter

The START parameter may be specified only once on the control card(s), but may be continued on more than one card.
Index

Sample JCL

//FILECOMP   EXEC PGM=FILECOMP
//SYSPRINT   DD SYSOUT=*
//SYSUDUMP   DD SYSOUT=*
//SYSUT1     DD DSN=ORIGINAL.OUTPUT.FILE,DISP=OLD
//SYSUT2     DD DSN=TEXT.OUTPUT.FILE,DISP=OLD
//SYSIN      DD *
TYPE=F,RECSIZE=80,IGNPPS=Y,OMIT=(22,8,51,3),KEYFLD=(1,6,PD,A)
/*

The example above may be used to compare two catalogued files. The control card parameters specify that the files are fixed format with 80 character records, positive sign differences of packed decimal fields will be ignored, positions 22 through 29 and 51 through 53 on both records will be excluded from error checking and the files are sorted on a key in positions 1 through 6 of ascending sequence in packed decimal format.

Index

IEBCOPY

IEBCOPY is used to copy all or a part of a PDS or PDSE. Selected members of a PDS or PDSE can be copied to another or the same PDS or PDSE and/or renamed.  A sequential backup copy of a sequential copy previously created by an unload.  You can load a PDS to an SMS managed PDSE.  Copying a PDSE to a PDS can be done, but application information stored in the directory of the PDSE will be lost.  Altering RLD counts for load modules in place can also be done. You can optionally re-block load modules during a copy operation. Finally, IEBCOPY is used to "compress" a PDS when all of its unused internal space has been exhausted.  The compress operation reorganizes a PDS so that all previously unused space inside the PDS is reclaimed. 

Sample IEBCOPY JCL:

//STEPCOPY EXEC PGM=IEBCOPY           
//OLDFILE  DD DSN=G1SG00AT.OFFSHORE.PARMLIB,DISP=SHR            
//NEWFILE  DD DSN=G1SG00AT.BACKUP.PARMLIB,DISP=OLD          
//SYSUT3   DD UNIT=SYSDA,SPACE=(TRK,(30,30),RLSE)
//SYSUT4   DD UNIT=SYSDA,SPACE=(TRK,(30,30),RLSE)
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSIN    DD *                                
 <control statements>
/*

Valid control statements are COPY, ALTERMOD, COPYMOD, SELECT, and EXCLUDE. Control statements are continued by placing a non-blank character in column 72 and continuing the statement beginning in column 16 on the next statement. The syntax and usage of each is discussed below:

•	COPY

This statement indicates the beginning of a copy operation and identifies the DD statements to be used during the copy.  The format of the COPY control statement is:

{label} COPY OUTDD=ddname,
        INDD=(ddname1,ddname2,(ddname3,R),...)
        {,LIST=NO}

The LIST=NO keyword is optional and tells IEBCOPY that you don't want a list of the members in the PDS.

COPY can be abbreviated as 'C', OUTDD as 'O', and INDD as 'I'.

Note : When copying from a sequential file or a PDS to another PDS, specify the 'R' parameter after the input DD name if you want ALL identically named members replaced on the output file.

Identically named members are only replaced on a copy operation if you request the REPLACE option on the COPY statement, or on the SELECT statement, described later. COPY Statement examples follow:

Example 1 - Copy all with replace.

 {label} COPY OUTDD=O,INDD=((I,R))
 
Example 2 - Copy without replace.

 {label} C O=TAPE,I=DASD

Example 3 - Compress-in-place!

 {label} COPY OUTDD=SYSUT1,I=SYSUT1

Index
•	SELECT

The SELECT statement is used to name members to be included in a  copy operation.  The SELECT statement must be preceded by a COPY or COPYMOD statement, or the INDD= portion of a COPY statement. A SELECT statement may not appear in the same COPY operation as an EXCLUDE statement, neither can SELECT be used in a compress operation. A SELECT member is only replaced in the output data set if the REPLACE option ('R') is set on the SELECT statement or on the INDD portion of the COPY statement.  Possible formats of the SELECT control statement are:

Format 1 - Copy selected members.

{label} SELECT MEMBER=name

Format 2 - Copy a list of members.

{label} SELECT MEMBER=(name1,name2,name3...)

Format 3 - Copy a list of members and rename them.

{label} SELECT MEMBER=((name1,newname1),(name2,newname2),...)

Format 4 - Copy a list of members and replace them if they are already in the output data set.

{label} SELECT MEMBER=((name1,,R),(name2,,R),...)
Index

•	EXCLUDE

The EXCLUDE statement is used to name members to be excluded from A copy operation.  The EXCLUDE statement must be preceded by a COPY or COPYMOD statement, or the INDD= portion of a COPY statement.  An EXCLUDE statement may not appear in the same COPY operation as a SELECT statement, neither can EXCLUDE be used in a compress operation. The format of the SELECT control statement is:

Format -

{label} EXCLUDE MEMBER=(name1,name2,name3,...)
Index
•	JCL to compress a PDS

//JS10    EXEC PGM=IEBCOPY,REGION=1M
//SYSPRINT  DD SYSOUT=*
//I1        DD DSN=G1SG00AT.OFFSHORE.JCL,DISP=OLD
//O1        DD DSN=G1SG00AT.OFFSHORE.JCL,DISP=OLD
//SYSIN     DD *
  COMP1 C O=O1,I=((I1,R))

Or

//COMPRESS EXEC  PGM=IEBCOPY,REGION=0K
//SYSPRINT DD SYSOUT=*
//PDSIN    DD DSN=PUFAP.PARMLIB.CYCLE,DISP=SHR
//PDSOUT   DD DSN=PUFAP.PARMLIB.CYCLE,DISP=OLD
//SYSIN    DD *
  COPY INDD=PDSIN,OUTDD=PDSOUT
Index

•	JCL to unload a PDS to a tape

//STEP1   EXEC PGM=IEBCOPY,REGION=1024K
//SYSPRINT  DD SYSOUT=*
//I1        DD DSN= G1SG00AT.OFFSHORE.JCL,DISP=OLD
//O1        DD DSN= G1SG00AT.OFFSHORE.JCL.TAPE.COPY,
//             DISP=(NEW,CATLG,DELETE),UNIT=TAPE
//SYSIN     DD *
  COPY1 C O=O1,I=((I1,R)) 
Index

•	JCL to load a PDS to DASD from a sequential unloaded copy

//PDSLOAD EXEC PGM=IEBCOPY,REGION=1M
//SYSPRINT  DD SYSOUT=*
//I1        DD DSN=G1SG00AT.OFFSHORE.JCL.SEQ.COPY,DISP=OLD
//O1        DD DSN=G1SG00AT.OFFSHORE.JCL,
//             DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
//             SPACE=(TRK,(30,30,10),RLSE)
//SYSIN     DD *
  COPY1 C O=O1,I=((I1,R))
Index

•	JCL to copy 4 members from one PDS to another

//PDSCOPY EXEC PGM=IEBCOPY,REGION=1024K
//SYSPRINT  DD SYSOUT=*
//I1        DD DSN=G1SG00AT.OFFSHORE.JCL,DISP=SHR
//O1        DD DSN=G1SG00AT.PRODVER.JCL,DISP=SHR
//SYSIN     DD *
  COPY1 C O=O1,I=((I1,R))
  SELC1 S M=MEMBER1,MEMBER2
  SELC2 S M=((MEMBER3,NEWMEM3),MEMBER4)
Index

IDCAMS

The IDCAMS (also known as Access Method Services) is a versatile utility that can be invoked in batch mode with JCL or interactively with TSO commands. With JCL one can print or display datasets and system messages and return codes. IF - THEN - ELSE constructs can be used to execute commands selectively based on condition codes returned by previous commands.

It can be used to perform following tasks:

•	Create a VSAM data set, VSAM alternate index, or catalog
•	List a catalog entry for a data set, file/catalog contents
•	Copy a file or catalog
•	Print all or part of a data set in character or hex format
•	Build a backup copy of a VSAM data set, catalog, non-VSAM data set, or an alternate index
•	Convert non-VSAM to VSAM data set, VSAM to SAM format, CVOLs to ICF catalogs, VSAM catalog entries to ICF catalog entries
•	Alter the attributes of a catalog or data set
•	Catalog or Uncatalog VSAM/non-VSAM data set and GDGs
•	Delete a VSAM or non-VSAM data set or volume records, catalog, path, GDG, alias, candidate volume, alternate index, pagespace, or true name catalog entry
•	Verify a VSAM data set's software end-of-file indicator
•	Attach a user catalog to the master catalog
•	Create a MVS paging space, generation data group (GDG)
•	Collect data set and volume info. on migration utility
•	Connect catalogs to one another
•	Import/Export VSAM data sets, catalogs
•	Load a VSAM file from SAM, ISAM, or VSAM records
•	Unload a VSAM data set
•	Merge ICF catalogs or recreate ICF entries
•	Rename VSAM data sets
•	Move a catalog and VSAM/non-VSAM data sets

Sample IDCAMS JCL:

//JS10    EXEC PGM=IDCAMS,REGION=1024K,PARM=parameters
//STEPCAT   DD DSN=...,DISP=SHR     Optional STEPCAT
//anyname   DD DSN=...              Optional file
//SYSPRINT  DD SYSOUT=*             IDCAMS Messages file
//SYSIN     DD *                    Control Statements file
 control statements...
/*

Below are some commonly used IDCAMS examples:
•	Uncatalog files

Non-VSAM files

//JS10   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 DELETE -
    TEST.WORK.DATABASE -    /* DATA SET TO BE UNCATALOGED */
    NOSCRATCH          /* TELLS IDCAMS TO UNCATALOG, NOT DELETE */

•	Delete files

Non-VSAM files

//STEPDEL1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//SYSIN    DD *
  DELETE   G1SG00AT.OLDFILE1  -
  DELETE   G1SG00AT.OLDFILE2  -
  IF MAXCC = 08 THEN 
     SET MAXCC = 00
/*
Index

VSAM files

//STEPDEL1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//SYSIN    DD *
  DELETE   G1SG00AT.OLDVSAM1  -
           PURGE              -
           CLUSTER
  IF LASTCC < 09 THEN 
     SET MAXCC = 00
/*
Index

•	Copy data 
       
a) Example1: Copy a GDG to 2 flat files. 

//STEPCOPY EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//COPYIN   DD DSN=G1SG00AT.INGDG(0),DISP=SHR
//COPYOUT  DD DSN=G1SG00AT.FLATFIL1,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM
//COPYOUT1 DD DSN=G1SG00AT.FLATFIL2,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM
//SYSIN    DD *
  REPRO                         		-
        IFILE(COPYIN)				-
           OFILE(COPYOUT)
  REPRO                         		-
        IFILE(COPYIN)				-
           OFILE(COPYOUT1)
/*
Index

b) Example2: Some records of input file are skipped & fixed count of records are copied only.  

//STEPCOPY EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//INPFILE  DD DSN=G1SG00AT.INPUT,DISP=SHR
//OUTFILE  DD DSN=G1SG00AT.OUTPUT,DISP=SHR
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM
//SYSIN    DD *
  REPRO							-
        IFILE(INPFILE)         		-
        OFILE(OUTFILE)         		-
        SKIP(100)	               -
        COUNT(500) 
/*
Index

a)	Example3: Extract a subset of a VSAM KSDS to a sequential file

//STEPCOPY EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//INPFILE  DD DSN=G1SG00AT.INPUT.VSAM,DISP=SHR
//OUTFILE  DD DSN=G1SG00AT.OUTPUT.FLAT,DISP=SHR
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS),
//         MGMTCLAS=TSONORM
//SYSIN    DD *
  REPRO							-
        INDATASET(INPFILE)      	-
        OUTFILE(OUTFILE)        	-
        FROMKEY(BZ0300A0) 			-
        TOKEY(BZ0399A9) 
/*
Index

•	Allocate vsam files/indexes 

To allocate vsam cluster

//STEPDEF1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//SYSIN    DD *
  DEFINE   CLUSTER 				-
          (NAME(G1SG00AT.CLUSTER)	 	-
           MGMTCLAS(TSONORM) 			-
           TRK(10 10) 				-
           SHR(2 3) 				-
           REUSE 					-
           SPEED 					-
           NOIMBED 				-
           RECSZ (40 40) 			-
           FSPC (0 0) 				-
           KEYS (12 14) 			-
          ) 					-
           DATA 					-
          (NAME(G1SG00AT.CLUSTER.DATA)	-
           CISZ(20480) 				-
       ) 					-    
        INDEX 					-
       (NAME(G1SG00AT.CLUSTER.INDEX)	-
        CISZ(512)				-
       )
/*
Index

•	Copy a sequential file to vsam & define alternate index 

//STEPDEF1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//INPFILE  DD DSN=G1SG00AT.INPUT,DISP=SHR
//OUTFILE  DD DSN=G1SG00AT.CLUSTER,DISP=SHR
//SYSIN    DD *
  REPRO    IFILE(INPFILE) OFILE(OUTFIL)
  DEFINE 							-
           ALTERNATEINDEX 				-
          (NAME(G1SG00AT.CLUSTER.AIX) 		-
           RELATE(G1SG00AT.CLUSTER.DATA) 		-
           FSPC(0 0) 					-
           KEYS(34 06) 					-
           TRACKS(1000 750) 				-
           RECSZ(128 128) 				-
           UNIQUEKEY 					-
          ) 						-
        DATA 						-
          (NAME(G1SG00AT.CLUSTER.AIX.DATA) 	-
       ) 						-
        INDEX 						-
          (NAME(G1SG00AT.CLUSTER.AIX.INDEX) 	-
          ) 
  DEFINE 							-
        PATH 						-
          (NAME(G1SG00AT.CLUSTER.AIX.PATH) 	-
           PATHENTRY(G1SG00AT.CLUSTER.AIX) 	-
          )
/*
Index

•	Build alternate index from base cluster 
 
//DS580416 EXEC PGM=IDCAMS,
//PRMINDEX DD DSN=DS.DS580412.AGGR,DISP=SHR
//ALTINDEX DD DSN=DS.DS580412.AGGR.AIX,DISP=SHR
//IDCUT1   DD DSN=DS.DS580416.TEMP1,DISP=OLD,UNIT=IDMP,
//         VOL=(,,,,SER=(PDS001))
//IDCUT2   DD DSN=DS.DS580416.TEMP2,DISP=OLD,UNIT=IDMP,
//         VOL=(,,,,SER=(PDS001))
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  BLDINDEX INFILE(PRMINDEX) OUTFILE(ALTINDEX)
/*
Index

•	Define GDG base 

//STEPDEF1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DEFINE   GDG(NAME('G1SG00AT.GDGNAME1') -
               NOEMPTY,SCRATCH,LIMIT(30))
//STEPEMPT EXEC PGM=IEFBR14
//         IF ( STEPDEF = 0 ) THEN
//NEWVER01 DD DSN= G1SG00AT.GDGNAME1(+),
//            DISP=(,CATLG),
//            SPACE(TRK,(5,2))
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
//         ENDIF
Index

COMPAREX

COMPAREX utility allows you to restrict the compare to certain fields within each record, or to ignore certain fields.
   
FIELDs are used to specify which   fields are to be compared.   
MASKS,are used to specify which fields are not to be  compared.

For example:

F=FIELD   --------FIELD ONE---------   ----FIELD TWO---------
M=MASK    DISPLACEMENT LENGTH FORMAT   DISP  LEN  FORMAT   
   f        5           106
   f        111         4       p      112    3     b
   m        33          7       z
 
Generates: FIELD=(5,106,C)
           FIELD1=(111,4,P) FIELD2=(112,3,B)
           MASK=(33,7,Z)
 
For example: 

//JS30    EXEC PGM=COMPAREX
//SYSPRINT  DD SYSOUT=*
//SYSUT1    DD DSN=TCEX.Q133P020.F02A.PREMOUT,DISP=SHR
//SYSUT2    DD DSN=TCEX.Q133P020.F02A.PREMOUT.TEST,DISP=SHR
//SYSIN     DD *
 FORMAT=13
/*

COMPAREX USING MASK COMMAND i.e.

//SYSIN     DD *
  FORMAT=13
  MASK=(271,20,C)

where

MASK=(Position, Length and Type)

For example MASK=(271,20,C) means, Do NOT compare the data from position 271 + 20 Characters (C stands for characters).

And where Format equals :- 

FORMAT - xy specifies DATA formatting characteristics in how differences are displayed.
Two numerics x and y carry meanings as

x equals

X	Equals	
0	0-dump format	
1	alphanumeric line	
2	DITTO format (vertical hex)	

y equals

Y	Equals	
1	full display of SYSUT1 followed by full SYSUT2	
2	full display of SYSUT1 followed by differing lines of SYSUT2	
3	differing lines of SYSUT1 followed by differing lines of SYSUT2	
4	full display of SYSUT1 interleaved with full display of SYSUT2	
5	full display of SYSUT1 interleaved with differing lines of SYSUT2	
6	differing lines of SYSUT1 interleaved with differing lines of SYSUT2	

Index

FILEAID

File-Aid is a versatile utility that is basically used for re-formatting data while copying from another data set. Apart from several usage of this utility like copy data sets, concatenate datasets etc., FILEAID can also be used to check whether a file is empty or not. Below is the general structure of File-Aid batch processing JCL.

•	General Structure

//STEPNAME EXEC PGM=FILEAID
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
Index

Using different SYSIN control cards we can have different functions of FILEAID. Here are a few examples:
•	Check for empty files

//CHKEMPTY EXEC PGM=FILEAID 
//DD01     DD DSN=G1SG00AT.INFILE,DISP=SHR
//DD01O    DD DSN=DUMMY,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA
//SYSOUT   DD *
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD DUMMY

If the input file is empty then this step will give RC = '08'. Trapping the return code of this step one can say whether the input file was empty.
Index

•	Copy dataset - one to one

//STEPCOPY EXEC PGM=FILEAID
//DD01     DD DSN=G1SG00AT.INPUT1,DISP=SHR
//DD01O    DD DSN=G1SG00AT.OUTPUT1,DISP=OLD
//DD02     DD DSN=G1SG00AT.INPUT2,DISP=SHR
//DD02O    DD DSN=G1SG00AT.OUTPUT2,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD DUMMY		or code COPY as instream

Here by default SYSIN parameter is 'COPY'. Copy is done from DD01 to DD01O although DD02 and DD02O are coded.
Index

•	Copy dataset - many to many

//STEPCOPY EXEC PGM=FILEAID
//DD01     DD DSN=G1SG00AT.INPUT1,DISP=SHR
//DD01O    DD DSN=G1SG00AT.OUTPUT1,DISP=OLD
//DD02     DD DSN=G1SG00AT.INPUT2,DISP=SHR
//DD02O    DD DSN=G1SG00AT.OUTPUT2,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01 COPY
$$DD02 COPY
/*
 
Here DD01 is copied to DD01O and DD02 is copied to DD02O
Index

•	Conditional copy

$$DD01 COPY IF=(776,GE,P'2'),IF=(1311,EQ,C'1')

In this example, copy input file data only if 776th digit is greater than or equal to 2 in packed digit format or if 1131st character is equal to '1'.

$$DD01  COPY IF=(14,EQ,C'173',14,EQ,C'326')

Multiple if entries are coded within a single IF parameter. It is a format to code logical OR conditions. If input record contains characters 173 or 326 at the location 14 then only they are copied to the output file.

$$DD01  COPY IF=(8,EQ,C'275'),
             IF=(8,EQ,C'494'),
             ORIF=(8,EQ,C'195'),
             AND=(50,EQ,C'02')

Logical AND condition is coded using two contiguous IF statements. The combination of ORIF and AND creates another pair of logical AND condition.

$$DD01  COPY IF=(8,EQ,C'275'),
             AND=(60,2,NE,C'SU'),
             ORIF=(8,EQ,C'195'),
             AND=(50,EQ,C'0')

Copy those records which has character '275' at location 8 and characters not equal to 'SU' at location 60 ro character '195' at location 8 and '0' at location 50.

$$DD01  COPY IF=(8,EQ,C'423'),OUT=5,PRINT=2

This is a combination of COPY, IF, OUT and PRINT. It copies the first 5 records that contain the string '423' at location 8 and prints the first 2 selected records. Here the printed records will go to DD name specified in SYSLIST.

$$DD01  COPY MOVE=(1,10C'ABC')

Combination of COPY and MOVE. It copies ten repetition of the string to the output location 1 through 30.

$$DD01  COPY OUT=60

Combination of COPY and OUT. It copies the first 60 records to the output data set.

$$DD01  COPY PRINT=15

Combination of COPY and PRINT. It copies the input dataset while printing the first 15 records.

$$DD01 COPY SELECT=4,OUT=100,IF=(8,EQ,C'423')

Combination of COPY, SELECT, OUT and IF. It creates an extract file of every fourth input record that contains a value of '423' at location 8. A maximum of 100 such records are copied.

$$DD01 DROP IF=(8,EQ,C'423'),OUT=10

Copy input dataset but drop records containing '423' at location 8. Also stop copying after 10 records.
Index
•	 Using pointer mechanism

//STEPNAME EXEC PGM=FILEAID
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE1,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01  SPACE  IN=25
$$DD01  COPY OUT=6

The SPACE function is used to position the pointer at a specific record. The first control card places the pointer at the 25th record. The second control card copies the next 6 records.

$$DD01  SPACE STOP=(8,4,C'423')
$$DD01  DUMP  IN=6

Combination of SPACE, STOP, DUMP and IN. it prints the record with '423' at location 8 and the next five records.
Index

•	Replace

//STEPNAME EXEC PGM=FILEAID,PARM=TSO
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE1,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01 COPYALL IF=(1,EQ,C'7,8'),
       REPL=(6,EQ,C'8000',C'8420'),
       REPL=(6,EQ,C'8001',C'8421'),
       REPL=(6,EQ,C'0405',C'8425'),
       REPL=(6,EQ,C'0406',C'8426'),
       REPL=(6,EQ,C'0407',C'8427'),
       REPL=(6,EQ,C'0408',C'8428')

In this example, if character '7' or '8' is found in column 1 of input file and characters '8000' is found in column 6 of input file then it is replaced by characters '8240' in output file from column 6 onwards.

$$DD01  COPY RA=(1,60,C'ABCD',2C'XY')

Combination of COPY and REPLALL. It copies all input records while REPLALL parameter scans locations from 1 to 60 of each record and replaces all occurrences of the string 'ABCD' with 'XYXY'.

$$DD01  COPY IF=(8,EQ,C'275'),
             ORIF=(60,EQ,C'SU'),
             REPL=(1,C'ABC')

Combination of COPY, IF, ORIF and REPLACE. It copies the records that have characters '275' at location 8 or 'SU' at location 60. If location 60 has characters 'SU' then it overlays the data at location 1 with 'ABC'.

Index
 
•	Edit

//STEPNAME EXEC PGM=FILEAID,PARM=TSO
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE1,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01 COPY  EDIT=(1,6,C'AAAA',C'BBBBBBBB')

Replaces the string 'AAAA' with the string 'BBBBBBBB'. When the longer new data is inserted then the fields are shifted and when required compressed for spaces.

$$DD01  COPY EDITALL=(1,50,C'ABC,GHI',C' ')

Combination of COPY and EDITALL. This eliminates all occurrences of the string 'ABC' and 'GHI' because the new data is a NULL entry.

$$DD01  UPDATE IN=100
$$DD01  UPDATE REPL=(55,EQ,C'EXGLA','AAAAA')

Combination of UPDATE, IN and REPLACE. It makes permanent changes to an existing data set. The first update places the pointer at a particular record and the second UPDATE replaces the data.

Index

•	Accumulation and tallying 

//STEPNAME EXEC PGM=FILEAID
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE1,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01  ACCUM=(50,4,C,'TOTALS')

Accumulates the 4 byte field starting at position 50 and prints the total in SYSTOTAL and labels it as 'TOTALS'.

$$DD01 TALLY IF=(8,EQ,C'275'),
 IF=(60,EQ,C'SU'),
 ACCUM=(50,4,C,'TOTAL'),
             IF=(55,EQ,C'EXGLA'),
 ACCUM=(15,1,C,'SUBTOTAL')

A combination of COPY, IF and ACCUM. the TALLY function binds the two ACCUM functions. It checks whether the first two IF conditions are satisfied. If so then the totals of the field from 50 to 54 are generated and labeled under the heading 'TOTALS'. For the second IF the field at location 15 is accumulated and labeled the heading as 'SUBTOTAL'.

Index

•	Backward processing of records

//STEPNAME EXEC PGM=FILEAID
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//DD01O    DD DSN=OUTPUT.FILE1,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01  SPACEBACK  STOP=(8,0,C'423')
$$DD01  DUMPBACK  OUT=6

It uses the back function which provides the backward processing of the records. SPACEBACK will do the backward processing of the records and stops at the record which satisfies the particular condition provided in the STOP parameter. The DUMPBACK will also do the backward processing and print such 6 records.

Index
 
•	User functions - split input file

//STEPNAME EXEC PGM=FILEAID
//DD01     DD DSN=INPUT.FILE,DISP=SHR
//FILE01   DD DSN=OUTPUT.FILE1,DISP=OLD
//FILE02   DD DSN=OUTPUT.FILE2,DISP=OLD
//FILE03   DD DSN=OUTPUT.FILE3,DISP=OLD
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST  DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//SYSIN    DD *
$$DD01 USER    IF=(28,EQ,C'BC4,BC9,BC5,DFC'),
               WRITE=FILE01,
               IF=(28,NE,C'BC4,BC9,BC5,DFC'),
               WRITE=FILE02

Here step checks 28th characters onwards in input file in characters mode. If field contains values 'BC4', 'BC9', 'BC5' or 'DFC' then output 1 is written else output 2 is written.

$$DD01 USER WRITE=FILE02,
 IF=(55,EQ,C'EXGLA'),
       MOVE=(55,C'SSSSS'),
 WRITE=FILE02

Combination of USER, WRITE, IF and MOVE. The first WRITE parameter writes all the input records and if the selection criteria matches then it performs the MOVE and then repeats the records with the changed value in the output data set.

Index

FASTDEL

This utility deletes all cataloged files as coded in SYSIN statement. Acts similar to TSO DEL 'filename' option.

//FASTDEL1 EXEC PGM=FASTDEL
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
G1SG00AT.FILE.TOBE.DELETED
/*
//*
Index

SORT

This utility is commonly used to sort data, copy selective data, merge 2 to 100 (previously 16) previously sorted datasets, remove duplicates, change data throughout the file etc. The input and output files processed by SORT can be sequential as well as VSAM files containing fixed length or variable length format records. 

Other program names, which can be used to invoke the sort are ICEMAN, IERRCO00, IGHRCO00, and SYNCSORT.

The general structure of all SORT functions is as follows. The contents of the PARMFILE will determine the nature of SORT. 

Note: Sorting can be done from ISPF prompt also. For this, open file to be sorted, in edit mode. Then use command 'SORT 1 22' to sort from 1st to 22nd characters, and so on.
•	General structure

//STEPSORT EXEC PGM=SORT,PARM=sort-parms
//SORTIN   DD DSN=G1SG00AT.SORTIN1,DISP=SHR  Input for sort
//SORTINnn DD DSN=G1SG00AT.SORTIN2,DISP=SHR  Input for merge
//SORTOUT  DD DSN=G1SG00AT.SORTOUT,
//         DISP=(NEW,CATLG,DELETE),
//         UNIT=SYSDA,
//         SPACE=(CYL,(2,2),RLSE),
//         DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SORTOFnn DD DSN=G1SG00AT.SORTOUT,      Output data sets
//         DISP=OLD
//SORTXSUM DD DSN=G1SG00AT.SORTOUT,     Records eliminated by SUMM
//         DISP=OLD
//SORTWK01 DD SPACE=(CYL,(20,15),RLSE),UNIT=SYSDA
//SORTWK02 DD SPACE=(CYL,(20,15),RLSE),UNIT=SYSDA
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  <control statements>

Index

SORTIN: This is the input file for SORT or copy requests. It can be a sequential data set, an extended sequential data set, a PDS member, a PDSE member, or a VSAM data set (ESDS, KSDS, or RRDS). SORTIN data sets can be BatchPipes/MVS pipes or HFS data sets. Files can be concatenated if the RECFM is the same for all concatenated files. For RECFM=V data sets, the largest LRECL of the input data sets found at sort initialization is used. The largest BLKSIZE of the input data sets found at sort initialization is used. Maximum record lengths are 32,760 for fixed-length records and 32,767 for variable-length records.
When sorting very large amounts of data and the disk space is limited, a MAXSORT technique is recommended.

SORTINnn: Used for MERGE request input files; up to 100 SORTINnn DD's may be specified. The 'nn' suffix can be any number in the range 00 thru 99; they may be skipped or used out of order. The files must already be sorted in the proper sequence for the MERGE. SORTINxx data sets can be BatchPipes/MVS pipes or HFS data sets.                                              SORTINnn data sets must have the same RECFM.

SORTOUT: Output file for a SORT, MERGE, or copy function.  It can be a sequential data set, an extended sequential data set, a PDS member, a PDSE member, or a VSAM data set (ESDS, KSDS, or RRDS). SORTOUT data sets can be BatchPipes/MVS pipes or HFS data sets. DCB attributes are copied from the input file. 

SORTOFnn: Output file for a SORT, MERGE, or copy function.  Up to 100 SORTOFnn DD's may be specified. The 'nn' suffix can be any number in the range 00 through 99; they may be skipped or used out of order. The FNAMES parameter on the OUTFILE control statement specifies the DD names of the output files and the output records that are written to each SORTOFnn data set.

SORTXSUM: Output file for a SORT or MERGE function.  The records eliminated by SUM processing are written to the SORTXSUM DD.
                                                             
SORTWKnn: From 1 to 100 sort work files can be allocated using the     
SORTWKnn DD statement; the 'nn' suffix can be any number in the range 00 thru 99.  SORTWKnn DD's are not used for a MERGE or a copy operation, or if the DYNALLOC parm is used. Each SORTWKnn MUST be on one unit & one volume. For optimum performance, allocate work space in cylinders. Do not code CONTIG, and only code RLSE & a secondary allocation amount if these are not set as sort defaults at your installation. However, use of MAXSORT limits SORTWKnn to maximum 32 data sets.

Index

Sort control statements:

•	INCLUDE

The INCLUDE control statement is used to establish selection criteria for the records to be included in the output data set. You can include a record by comparing the contents of its fields to a constant or to another field in the record. The INCLUDE statement must not appear with the OMIT statement in the same SORT execution.  If the results of any comparison made by the INCLUDE statement are true, the record is included in the sort's output. The format of the INCLUDE statement is:

   {ALL}                                 
             {NONE}                                
INCLUDE COND={({c1,{AND | OR},c2},...){,FORMAT=x} }

COND=ALL means all input records are to be included.          
COND=NONE means none of the input records are to be included. 
AND may be specified as &.  OR may be specified as ¦.         
                                                              
'c1' and 'c2' contains the following elements:                
                                                              
{p1,l1,f1}{,EQ|NE|GT|GE|LT|LE,}{p2,l2,f2 | constant-value}    
{p1,l1}   {,BI{,BO,|,ALL,|,BM,|,SOME,|,BZ,|,NONE,|,BNO,|      
           ,NOTALL,|,BNM,|,NOTSOME,|,BNZ,|,NOTNONE,} bit-mask}
{p1,l1}   {,BI{,EQ|NE,} bit-pattern}                          
{p1,l1}   {,SS{,EQ|NE,} constant}

Where:
'p1' is the relative byte number of a field to be compared in the input records, with the first byte in the record being byte number one for fixed length records and byte number five for variable length records.
'l1' is the length in bytes of 'p1'.
'f1' is the data type for 'p1' and can be one of these:

AC - 1 to 256 bytes - EBCDIC translated to ASCII before sort or merge
AQ - 1 to 256 bytes - character, but alternate collating sequence set by ALTSEQ= or default at install time
ASL - 2 to 256 bytes - leading ASCII separate sign       
AST - 2 to 256 bytes - trailing ASCII separate sign      
BI - 1 to 4092 bytes- binary                            
CH - 1 to 4092 bytes- character                         
CLO or OL - 1 to 256- leading overpunch in 1st 4 bits of field is the sign - X'F', C, E, or A=Positive, D or B=negative
CSF/FS - 1 to 16    - floating sign format                
CSL or LS - 1 to 256- leading EBCDIC separate sign        
CST or TS - 1 to 256- trailing EBCDIC separate sign       
CTO/OT - 1 to 256   - zoned decimal, trailing overpunch in 1st 4 bits of rightmost byte is the sign X'F', C, E, or A=Positive, D or
B=negative (CTO forces CMP=CLC parm)
FI - 1 to 256 bytes - fixed point binary             
FL - 2 to 16 bytes  - normalized floating point      
PD - 1 to 256 bytes - packed signed decimal          
PD0 - 2 to 8 bytes  - packed decimal. first digit and trailing sign ignored.  Used for century window processing.
Y2B - 1 byte - 2 digit binary year treated as a 4-digit year by CENTWIN processing.   
Y2C - 2 byte - 2-digit character treated as a 4-digit year by CENTWIN processing.   
Y2D - 1 byte - 2-digit packed decimal treated as a 4-digit year by CENTWIN processing.   
Y2P - 2 byte - 2-digit packed decimal treated as a 4-digit year by CENTWIN processing. First digit and trailing sign ignored.
Y2S - 2 byte - 2-digit character or zoned decimal treated as a 4-digit year by CENTWIN processing.
Y2Z - 2 byte - 2-digit zoned decimal treated as a 4-digit year by CENTWIN processing. Zones are ignored.                   
ZD - 1 to 256 - zoned decimal, trailing overpunch in 1st 4 bits of rightmost byte is the sign X'F', C, E, or A=Positive, D or B=negative

'p2', 'l2', and 'f2' follow the same format rules but normally refer to another field in the same record. 'constant' is a constant specified as a decimal number preceded by an optional sign (e.g., +256), a hexadecimal constant (e.g., X'027F3A'), or a character constant (e.g., C'SURFBOARD').
If 'p1' is not the same length as 'p2', the shorter field is padded on the left for decimal fields or on the right for hex or character fields with zeros in the proper format before the comparison is done.

The AND and OR relational operators are used to link together as many repetitions of the 'expression' field as desired; AND and OR can be replaced by the symbols & and |.

A bit mask is a string of bits of either hexadeciaml or binary digits.  A binary bit mask is B'bb...bb'.  A hexadecimal bit mask is X'hh...hh'.

A bit pattern is a bit mask which has a length of which is a multiple of 8.

The comparison operators are:
EQ             equal
NE             not equal
GT             greater than
GE             greater than or equal to
LT             Less than         
LE             Less than or equal to
BO (ALL)       All mask bits are ON
BM (SOME)      Some but not all mask bits are ON
BZ (NONE)      None of the mask bits are ON
BNO (NOTALL)   Some or no mask bits are ON
BNM (NOTSOME)  All or no mask bits are ON
BNZ (NOTNONE)  All or some mask bits are ON

Below are some examples of INCLUDE statements:

INCLUDE COND=((10,3,CH,EQ,C'REV'),AND,(67,2,CH,NE,C'GA'))     
                       or                                     
INCLUDE COND=((10,3,EQ,C'REV'),AND,(67,2,NE,C'GA')),FORMAT=CH 
                                                              
The INCLUDE above will only pass through records with the character string 'REV' in position 10 and the state abbreviation 'GA' in position 67.  Both fields are character format.                                                       
                                                              
INCLUDE COND=((21,1,BI,EQ,X'22'),OR,                          
              (21,1,BI,EQ,X'47'),OR,                          
              (21,1,BI,EQ,X'F3'))                             
                                                              
The INCLUDE above will only pass through records with a X'22', X'47', or X'F3' in byte 21.

INCLUDE COND=(1,4,EQ,16,2),FORMAT=BI                          
                                                              
The INCLUDE above will only pass through records in which the contents of the four byte field at position 1 are equal to the contents of the 2 byte field in position 16. Both fields are treated as binary format for the comparison.  Please note that in this case, the shorter field will be padded on the right with binary zeros before the comparison is performed.
Index

•	INREC:

INREC reformats the input records.  You can use this statement to add, delete, or reformat fields before the records are sorted or merged.  INREC processing is performed after E15 exit processing and INCLUDE/OMIT control statement processing. 
Use of INREC improves the sort performance by reducing the number of bytes that must be processed.                                                               
Note: OUTREC adds, deletes, or reformats fields after the records are sorted or merged.                            
                                                               
The format of the INREC statement is
INREC FIELDS=(...)                                          
The FIELDS parameter simply identifies the fields that should be processed.

A sample INREC statement is as follows:                        
   INREC FIELDS=(1:1,20,21:40,15,ZD,PD,29:60,5)   
             
In this statement, 3 data fields are specified as follows:     
•	The first field begins in byte 1 of the input record and is 20 bytes long.  It will be in position 1 of the output record. 
•	The second field begins in byte 40 of the input record and is a 15-byte ZD field.  The field will be converted to PD. It will be in position 21 of the output record. 
The third field begins in byte 60 of the input record and is 5 bytes long.  It will be in position 29 of the output record.                                                     

This sample reduces an 80 byte record to 33 bytes.
Index

•	MERGE:

The MERGE control statement defines the application as a MERGE application.

MERGE FIELDS=...                   
             {,FILES=n}            
             {,EQUALS | NOEQUALS}  
             {,CKPT | CHKPT}       
             {,CENTWIN={0 | s | f}}
Index

•	OMIT:

The OMIT control statement is used to establish selection criteria for the records to be omitted from the output data set. You can omit a record by comparing the contents of its fields to a constant or to another field in the record. The OMIT statement must not appear with the INCLUDE statement in the same SORT execution.  If the results of any comparison made by the OMIT statement are true, the record is omitted from the sort's output.  

The format of the OMIT statement is:

  {ALL}                                           
            {NONE}                                          
OMIT   COND={({c1,{AND | OR},c2},...){,FORMAT=x} }          
                                                            
Below are some examples of the OMIT statement:                    
                                                                  
OMIT COND=((10,3,CH,EQ,C'REV'),AND,(67,2,CH,NE,C'GA'))            
or                                         
OMIT COND=((10,3,EQ,C'REV'),AND,(67,2,NE,C'GA')),FORMAT=CH        
                                                                  
The OMIT above will only pass through records that do NOT have the character string 'REV' in position 10 and the state abbreviation 'GA' in position 67.  Both fields are character format.           
                                                                  
OMIT COND=((21,1,BI,NE,X'22'),OR,(21,1,BI,X'47'),(21,1,BI,X'F3'))                                    
                                                                  
The OMIT above will only pass through records that do NOT have a X'22', X'47', or X'F3' in byte 21.                                
                                                                  
OMIT COND=(100,4,GT,+100000),FORMAT=BI

The OMIT above will only pass through records in which the contents of the four byte field at position 100 are NOT greater than a positive 100,000 decimal.
Index

•	OUTFIL:

The OUTFIL control statement describes the output file or files. It is used to accomplish these three tasks:

1.	Create multiple output files. This task uses these parameters: FILES, FNAMES, INCLUDE/OMIT, STARTREC, ENDREC, SAVE, OUTREC, CONVERT, SPLIT
2.	Use the SortWriter facility. This task uses these parameters: HEADER1, HEADER2, LINES, NODETAIL, SECTIONS, TRAILER1, TRAILER2.
3.	Reformat records after E35 processing. This task uses these parameters: OUTREC.

The format of the OUTFIL statement is:

OUTFIL  {FILES={fileid}                    
               {(fileid1 {fileid2}...}     
        {,FNAMES={ddname}                  
                 {(ddname1 {ddname2} ... )}
                  {ALL}                    
                  {NONE}                   
                  {    {,AND,}       }     
        {,INCLUDE={(c1,{,&,  } C2... }     
        {,OMIT=   {    {,OR, }       }     
                  {    {,¦,  }       }     
        {,STARTREC=n}                      
        {,ENDREC=n}                        
        {,SAVE}                            
        {,SPLIT}                           
        {,OUTREC=(field1, {,field2} ... )} 
        {,CONVERT}                         
        {,HEADER1=(field1, {,field2} ... )}
        {,HEADER2=(field1, {,field2} ... )} 
        {,TRAILER1=(field1, {,field2} ... )}
        {,TRAILER2=(field1, {,field2} ... )}
        {,SECTIONS=(field1, {,field2} ... )}
        {,LINES={n | ANSI | (ANSI,n)}}      
        {,NODETAIL}
Index

•	OUTREC:

The OUTREC control statement reformats the output file records. It is used to accomplish these tasks:

•	Delete or repeat segments of the input records.
•	Insert character strings between data fields.
•	Insert binary zeros. reate a sequence number field.                        
•	Convert numeric data to printable format or to another numeric data format.
•	Perform arithmetic operations (multiply, divide, add, subtract) and minimum and maximum functions with numeric fields and constants.
•	Convert data to printable hexadecimal format.
•	Select, realign, and reorder data fields.
•	Convert a variable length record input file to a fixed length record output file.

The format of the OUTFILE statement is as follows:  

OUTREC FIELDS=(field, {,field2} ... ){,CONVERT} 
Where:                                               
field can be specified as follows:              
       { p,l {,subparameters}                      }
       { p{,l} {,HEX}                              }
       { {n} X                                     }
    c: { {n} X'hhhh..hh"                           }
       { {n} C'literal string'                     }
       { {n} Z                                     }
       {                                           }
       { SEQNUM,l,f {,START={1 | n} {,INCR={1 | i} }

RECORD TYPE={F | V}                                         
       {,LENGTH=(leng1,leng2,leng3,leng4,leng5,leng6,leng7)}

The RECORD statement is required if your E15 or E35 exit changes the length of an input record, if you want to override DCB characteristics for the input data, or if your input an output are VSAM files. TYPE= indicates the record format of the input, fixed (F) or variable (V). The LENGTH= keyword supplies record length information to SORT; you can omit one of the 'leng' values if you code a double comma as follows:                   
                                                                
leng1 - maximum input record length                             
leng2 - maximum record length after E15 exit has processed data 
leng3 - maximum record length after E35 exit has processed data 
                                                                
'leng' values below are for TYPE=V data only:                   
                                                                
leng4 - minimum input record length                             
leng5 - most frequent record length in input                    
                                                                
'leng6' & 'leng7' are only needed for DISKSORT and MAXSORT techniques

leng6 - SORT HISTOGRM program's recommendation for work space needed to sort file                                   
leng7 - SORT HISTOGRM program's recommendation for the 'leng5' value
Index

•	COPY:

The SORT control statement with FIELDS=COPY defines the application as a COPY application.

SORT FIELDS=COPY           
            {,SKIPREC=n}   
            {,STOPAFT=n}   
            {,CKPT | CHKPT}

Where:
SKIPREC indicates the number of records to be skipped, STOPAFT indicates the number of records to process, and CKPT/CHKPT indicates a checkpoint is desired at the end of volume of a SORTOUT data set when OUTFIL is not used.
Index

•	SORT:

The SORT control statement defines the application as a SORT application.

SORT FIELDS=(pos1,len1,type1,opt1,pos2,len2,type2,opt2,...) 
            {,SIZE=n | En}                                  
            {,FILSZ=n | eN}                                 
            {,DYNALLOC=(OFF) | (d,n){,RETRY=(OFF | (nn,mm)}}
            {,SKIPREC=n}                                    
            {,STOPAFT=n}                                    
            {,EQUALS | NOEQUALS}                            
            {,CKPT | CHKPT}                                 
            {,CENTWIN={0 | s | f}

The FIELDS= keyword is used to identify the fields to use as sort keys. Each field is described using 4 values:          
'pos', its position in the record, relative to 1;         
'len', the field's length;                                
'type', the type of data stored in the field; and         
'opt', the sort order for the field which can be A for ascending, D for descending, or E as modified by an E61 exit.                       
Up to 128 fields can be sorted using one SORT control statement.
Index

•	SUM:

The SUM control statement deletes records with equal control fields and optionally summarizes specified numeric fields on those records.  If numeric fields are to be summarized, the data in the summary fields is added, the sum is placed in one of the records, and the other record is deleted.  Provided arithmetic overflow does not occur, the SUM statement produces only one record per sort key in the output data set.

The format of the SUM statement is:

        {FIELDS={NONE}                         }        
   SUM  {FIELDS=(p1,l1,f1 {,p2,l2,f2) ... )    }        
        {FIELDS=(p1,l1 {,p2,l2) ... ),FORMAT=f } {,XSUM}

Where XSUM means the dropped records are written in the dataset specified by SORTXSUM data set.
Index

•	END:

The END control statement is the last control statement.  It is required only when the control statements are not followed by /* or by a job control statement.
Comments can be included on this statement if at least one blank precedes the comment.
Index

Following are some mostly used examples of sort control statements:
•	Simple sort of input file data 

  SORT FIELDS=(1,4,A,10,5,D),FORMAT=CH
  SORT FIELDS=(1,4,CH,A,20,5,N,D)
Index
•	Simple sort and summation of particular field 

  SORT FIELDS=(1,4,A,10,5,D),FORMAT=CH
  SUM FIELDS=(12,24),XSUM

Index

•	Sort and copy selective data 
    
b)	INCLUDE COND copies data that matches the condition given.

  OPTION EQUALS
  SORT FIELDS=(1,4,A,10,3,D),FORMAT=CH
  INCLUDE COND=(1,1,CH,EQ,C'J',AND,10,3,CH,EQ,C'EMP')
Index

c)	OMIT COND copies data that does not match the condition given. INCLUDE and OMIT are mutually exclusive.

  OPTION EQUALS
  OMIT COND=(201,6,CH,EQ,C'W52156')
Index

•	Change data throughout file 

In this example 163rd character in file is changed to C. This can be useful to change data in file which is more than 255 characters in length as TSO edit option can not be used for it. 

  OPTION COPY
  OUTREC FIELDS=(1,162,C'C',164,137)
Index

•	Selective sort, duplicate removal and data modification
        
SUM FIELDS=NONE is used to remove duplicates. It compares data in columns mentioned in ‘SORT FIELD=  ‘ & removes second occurrence of matching data. 27X in Outrec fields means put 27 spaces.   

  OPTION EQUALS,DYNALLOC=(SYSDA,4)
  SORT FIELDS=(1,13,A),FORMAT=CH
  INCLUDE COND=(427,7,CH,EQ,C'CERSH')
  SUM FIELDS=NONE          
  OUTREC FIELDS=(1,696,27X,3720,3,3253,3,16X,6180,32,23X)
Index

•	Start copying after specified records
        
Start copying after skipping 1000 records.
  SORT FIELDS=COPY,SKIPREC=1000
Index

•	Stop copying after specified records
        
Stop copying after 1000 records.
  SORT FIELDS=COPY,STOPREC=1000
Index

GDG

GDG is a collection of historically related non-VSAM data sets that are arranged in chronological order; each data set is known as a Generation Data Set.

The DEFINE GENERATIONDATAGROUP command creates a catalog entry for a Generation Data Group (GDG).  The syntax of this command is:

DEFINE   	GENERATIONDATAGROUP
(NAME(entryname)   
LIMIT(limit)       
{EMPTY|NOEMPTY}    
{OWNER(ownerid)}   
{SCRATCH|NOSCRATCH}
{TO(date)|FOR(days)})
{CATALOG(catname{/password})}

Mandatory parameters:

GENERATIONDATAGROUP: Specifies that a generation data group (GDG) entry is to be defined. A GDG can contain both SMS- and non-SMS-managed generation data sets. A generation data set (GDS) cannot be a VSAM data set.  If you create a GDG and its catalog is on an SMS-managed volume, you should remove any dependencies on pattern DSCBs.  See DFSMS/MVS V1R3 Using Data Sets for information about GDGs and GDSs. Abbreviation GDG.

NAME(entryname): Specifies the name of the GDG being defined.

LIMIT(limit): Specifies the maximum number, from 1 to 255, of GDSs that can be associated with the GDG being defined. Abbreviation LIM.

Optional parameters:

CATALOG(catname./password.): identifies the catalog in which the generation data group is to be defined.  If the catalog's volume is physically mounted, it is dynamically allocated.  The volume must be mounted as permanently resident or reserved.  See "Catalog Selection Order for DEFINE" in topic 1.6.4 for the order in which a catalog is selected when the catalog's name is not specified. Here 'catname' and 'password' specifies catalog name and password. If the catalog is not SMS-managed and is password protected, one must supply the update (or higher level) password. Passwords are ignored for SMS-managed data sets and catalogs. Abbreviation CAT.

EMPTY|NOEMPTY: specifies what action is to be taken when the maximum number of GDSs for the GDG is exceeded and another GDS is to be cataloged.  The disposition of the data set's DSCB in the volume's VTOC is determined with the SCRATCH|NOSCRATCH parameter.  For SMS-managed data sets, the data set's NVR is also determined with the SCRATCH|NOSCRATCH parameter.  If NOSCRATCH is specified for an SMS-managed GDS, the GDS is uncataloged from its GDG base and can be recataloged outside its GDG base as an SMS non-VSAM entry with the roll-off status.
EMPTY specifies that all the generation data sets are to be uncataloged when the maximum is exceeded (each data set's non-VSAM entry is automatically deleted from the catalog). Abbreviation:  EMP.
NOEMPTY specifies that only the oldest generation data set is to be uncataloged when the maximum is reached. Abbreviation:  NEMP.

OWNER(ownerid): Identifies the generation data set's owner. Note to TSO Users:  If the owner is not identified with the OWNER parameter, the TSO userid is the default ownerid.

SCRATCH|NOSCRATCH: specifies whether a generation data set's DSCB is to be deleted from the volume's VTOC when the data set is uncataloged (that is, when its entry is deleted from the catalog automatically, as described under EMPTY|NOEMPTY, or explicitly as a result of a user entered DELETE request).  For SMS-managed GDSs, SCRATCH|NOSCRATCH specifies if the NVR is to be removed from the VVDS when the data set is uncataloged.
You can override the SCRATCH|NOSCRATCH attribute when issuing the DELETE command.
SCRATCH specifies that the generation data set's DSCB is to be deleted from the volume's VTOC when the generation data set is uncataloged.  Direct access device space management (DADSM) removes the data set's DSCB from the VTOC, erases the data set's space on the volume, and makes the space available to other system users.  The generation data set ceases to exist.  For SMS-managed GDSs, SCRATCH also specifies that the NVR is to be removed from the VVDS when the data set is uncataloged. Abbreviation:  SCR.
NOSCRATCH specifies that the generation data set's DSCB is not to be removed from the volume's VTOC when the generation data set is uncataloged.  The data set's DSCB in the volume's VTOC is left intact and can be used to locate the data set.  Your program, however, can process the data set by using a JCL DD statement to describe and allocate the data set. Abbreviation:  NSCR.

TO(date)|FOR(days): specifies the retention period for the GDG being defined.
TO(date) specifies the date through which to keep the GDG being defined. The date appears in the form .yy.yyddd, where yyyy is a four-digit year, yy is a two-digit year, and ddd is the three-digit (001 through 366) day of the year.  Two-digit years are treated as if "19" is specified as the first two digits of yyyy.
FOR(days) specifies the number of days to keep the GDG being defined.  The maximum number that can be specified is 9999.  If the number specified is 0 through 9998, the GDG is retained for the number of days specified; if the number is 9999, the GDG is retained indefinitely.  If neither TO nor FOR is specified, the GDG can be deleted at any time.

Note:

1.	The general naming convention of new Generation Data Sets is GDGbasename.GxxxxVyy, where 'xxxx' is the generation number and 'yy' is the version number.
2.	While referring to a GDG, omission of version number specifies all available versions to be included.
3.	Within a job, if step 1 creates a new version of GDG then in step 2 to refer to that version (+1) should be specified. But for several file transfer utilities like NDM, FTP, XCOM, to refer to the specified version of GDG one has to specify (0) th version.

Index
 
•	Define GDG base and create empty version 

//STEPDEF1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DEFINE   GDG(NAME('G1SG00AT.GDGNAME1') -
           NOEMPTY,SCRATCH,LIMIT(30))
//STEPEMPT EXEC PGM=IEFBR14
//         IF ( STEPDEF = 0 ) THEN
//NEWVER01 DD DSN= G1SG00AT.GDGNAME1(+),
//         DISP=(,CATLG),
//         SPACE(TRK,(5,2))
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
//         ENDIF

Here a new GDG base is created as 'G1SG00AT.GDGNAME1' in the first step. In the second step a new empty version of the same is created with name 'G1SG00AT.GDGNAME1.G0001V00'.

Index

•	Delete all existing versions of GDG 

//STEPDEL1 EXEC PGM=IEFBR14
//DELVER01 DD DSN= G1SG00AT.GDGNAME1,
//         DISP=(OLD,DELETE,DELETE),
//         SPACE(TRK,(1,1))
//SYSPRINT DD SYSOUT=*
//SYSIN    DD DUMMY

Here by specifying no version number of the existing GDG, all the existing versions of the GDG is deleted. However, the GDG base itself is not deleted.

Index

•	Delete GDG versions as well as base 

//STEPDELV EXEC PGM=IEFBR14
//DDNAME01 DD DSN=G1SG00AT.GDGNAME1,
//	     DISP=(OLD,DELETE,DELETE),
//	     SPACE=(TRK,(1,1),RLSE)
//SYSIN    DD DUMMY
//STEPDELG EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD *
//SYSIN    DD *
  DELETE   G1SG00AT.GDGNAME1  
/*

Here by IDCAMS utility deletes the GDG base. But for this step to execute successfully no versions of this GDG should be existing. In that case the JCL will complete with RC=08 and will not delete any versions as well as the base. So all the existing versions are to be deleted first by IEFBR14 and then the base is to be deleted by IDCAMS. However, on JEM/JSCAN, this JCL shows RC=04 warning as no catalog entry for G1SG00AT.GDGNAME1 found in the IDCAMS SYSIN. But the on execution the JCL completes with RC=00.
Index

NDM

This document describes a few useful hints about NDM Step, which can be used for sending some file from one mainframe region to another mainframe region as well as mainframe to Unix, using Network Data Mover.

Example:

The common job step will be as follows

//STEPNAME EXEC NDMBATCH
//DMPUBLIB DD DSN=G1SG00AT.OFFSHORE.PARMLIB,DISP=SHR
//SYSIN    DD *
  SIGNON * ESF=YES
  SUBMIT PROC=NDMPARMF CASE=YES
  SIGNOFF

DMPUBLIB specifies the library where the NDM parameter member will be searched for. The member G1SG00AT.OFFSHORE.PARMLIB(NDMPARMF) will contain NDM instructions that are to be executed.
•	Mainframe to mainframe file transfer:

GEAL2B22 PROCESS PNODE=GECC.2                              	-
                 SNODE=SQADB01                              -
                 SNODEID=(applmgr,applmgr)
STEP1    COPY    FROM(PNODE DSN=G2SC00AP.SC26.ROYAL.BKUP(0)	-
                 DISP=SHR)                                 	-
                 TO(SNODE DSN=CD.D2B.R1C1GEAL.INDATA22(+1) 	-
                 DISP=NEW)

STEP2    IF (STEP1=0) THEN                                 	-
                 RUN TASK (PGM=DMRTSUB                     	-
                 PARM=('DSN=IC.D4J.CD.JCLLIB(P2BACCUM),    	-
                 DISP=SHR',                                	-
'COMP  GEAL',                             	-                                                                                                                                                                                                                                      'DIVSN 22')) SNODE                        	-
         EIF

•	Mainframe to Unix file transfer:

COPYFILE  PROCESS  SNODE=SQADB01					-
                   PNODE=GECC.2					-
                   SNODEID=(applmgr,applmgr)
STEP1     COPY     FROM(PNODE						-
                   DSN=G1SG00AT.GECOM.ORACLE.OUT		-
                   DISP=SHR)						-
                   TO(SNODE						-
          		 DSN='/glfnqa01/appl/110/glc/11.0.28/data/gec_paris.dat' 	-
                   DISP=rpl)

•	Run task on mainframe:

GEAL2B22 PROCESS PNODE=GECC.2                              -
                 SNODE=SQADB01                             -
                 SNODEID=(applmgr,applmgr)
STEP1    COPY    FROM(PNODE DSN=G2SC00AP.SC26.ROYAL.BKUP(0)	-
                 DISP=SHR)                                 	-
                 TO(SNODE DSN=CD.D2B.R1C1GEAL.INDATA22(+1) 	-
                 DISP=NEW)

STEP2    IF (STEP1=0) THEN                                	-
                 RUN TASK (PGM=DMRTSUB                      -
                 PARM=('DSN=IC.D4J.CD.JCLLIB(P2BACCUM),    	-
                 DISP=SHR',                                	-
'COMP  GEAL',                             	-                                                                                                                                                                                                                                      'DIVSN 22')) SNODE                        	-
         EIF

•	Run shell script on Unix

COPYFILE  PROCESS  SNODE=SQADB01					-
                   PNODE=GECC.2					-
                   SNODEID=(applmgr,applmgr)
STEP1     RUN TASK SNODE (PGM=UNIX) 				-
                	 SYSOPTS = "/opt/appworx/shell_script.sh"

•	Run an AppWorx module in Unix if copy step is successful

COPYFILE PROCESS SNODE=SQADB01                                        -
                 PNODE=GECC.2                                         -
                 SNODEID=(appworx,appworx)
STEP1    COPY    FROM(PNODE                                           -
                 DSN=G1SG00AT.GECOM.ORACLE.OUT                        -
                 DISP=SHR)                                            -
                 TO(SNODE                                             -
                 DSN='/opt/appworx/bin/kc_test.dat'                   -
                 DISP=rpl)
         IF (STEP1=0) THEN
STEP2            RUN TASK SNODE (PGM=UNIX)                            -
                 SYSOPTS = "/opt/appworx/bin/module_test.sh KC_TEST"
         EIF

Index

Important note:

The source file might be created within the same job in which NDM step is executed or some other job also can create this source file. In case it is a GDG, then precaution has to be taken while coding the GDG version.

Even if the GDG is getting created within the same job in which NDM step is executed, then also to refer to the current version of GDG (say the GDG version which is to be sent by NDM) within NDM step (here within INPUT file), version(0) is to be used and not version(+1).
 
Similarly if GDG is created within NDM step (+1), then also to refer to that GDG in later steps in the same JCL, we will be referring to the (0) version of the GDG.

This is because the NDM step can be treated as a different job although it is syntactically within the same job.
Index

XCOM

This is basically a file transfer utility that can be used to transfer files from mainframe to mainframe, Unix or even to a PC directly. Below is the code that can be directly coded in a JCL.

//XCOMPRG  EXEC PGM=XCOMJOB,PARM=('TYPE=SCHEDULE,STCAPPL=GFSX4H')
//XCOMGLOB DD DSN=SYSD.CAI.XCOM30.S4HS.GLOBAL,DISP=SHR
//XCOMREST DD DSN=SYSD.CAI.XCOM30.S4HS.RESTART,DISP=SHR
//XCOMCNTL DD DSN=SYSD.CAI.XCOM30.S4HS.PARMLIB,DISP=SHR
//SYSIN01  DD *
< code the control cards here>

•	Control cards syntax

TYPE=SEND|RECEIVE             <<===CHOOSE ONE
LU=ZZZZZZZZ
FILEOPT=CREATE¦REPLACE¦ADD    <<===CHOOSE ONE
FILETYPE=FILE
LFILE=LOCAL.FILE.NAME
FILE=REMOTE.FILE.NAME
RECFM=AAA                     <<===ONLY FOR FILEOPT=CREATE
LRECL=BBB                     <<===ONLY FOR FILEOPT=CREATE
BLKSIZE=CCC                   <<===ONLY FOR FILEOPT=CREATE
UNIT=DDD                      <<===ONLY FOR FILEOPT=CREATE
CODE=EBCDIC
COMPRESS=YES
USERID=XXXXXXX
PASSWORD=YYYYYYYY

TYPE=SEND 		Indicates that the file transfer is outbound from the local mainframe
TYPE=RECEIVE 	Indicates that the file transfer is inbound from the remote mainframe
LU=ZZZZZZZZ 	this is the remote MVS systems network address
FILEOPT=CREATE	indicates how the transfer is to be handled on the receiving end. CREATE creates a new file. Note that only FILEOPT=CREATE requires LRECL, RECFM, BLKSIZE and UNIT control cards. If REPLACE is used then these cards may be omitted.
FILEOPT=REPLACE	replaces the transferred file
FILEOPT=ADD		appends the records to an existing file
FILETYPE=FILE	indicates type of output to be created on the remote system. Other file types are REPORT and JOB.
LFILE			indicates the name of local file to be transmitted. This dataset can also be specified in the step on DDNAME LCLDS01. If both LFILE and LCLDS01 are specified then LFILE overrides the LCLDS01. This can be a PDS member name or a flat file.
FILE			indicates the remote file on which the data is to be transmitted
RECFM=AAA		Indicates the MVS record format of the dataset on the local system, and is also used in allocating a new file on the remote system. Allowable values are he same as the MVS JCL RECFM parameter.
LRECL=BBB		indicates the logical record length of the local file and is used for allocating a new file on the remote system. 
BLKSIZE=CCC		indicates the block size of the dataset on the remote system. Allowable values are 4 to 99999.
UNIT=DDD		indicates the unit tape to be used when creating a file on the remote system.
CODE=EBCDIC		indicates the type of data being transferred. Other options are ASCII, BINARY and MVSBIN.
COMPRESS=YES	this provides a RLE (Run Length Encoding) compression scheme, which acts on blanks and binary zeros. Other options are RLE, COMPACT and COMPACTL.
USERID=XXXXXXXX	indicates the user id whose security privileges are to be used on the remote system.
PASSWORD=YYYYYYYY	indicates the password for the user id specified in the USERID parameter.

Index

•	Mainframe to mainframe file transfer

TYPE=SEND
LU=I021A200
FILEOPT=CREATE
FILETYPE=FILE
LFILE=G1SG00AT.LOCAL.FILENAME
FILE=G1SG00AT.OUTPUT.FILENAME
RECFM=FB
LRECL=80
BLKSIZE=8000
CODE=EBCDIC
COMPRESS=YES
USERID=G2CPA2T
PASSWORD=MYPASS001
Index

•	Mainframe to mainframe report transfer

Apart from the control cards mentioned above, the following extra cards are required for transferring report:

FILETYPE=REPORT
DEST=AAA
FCB=EEE
FORM=FFF
CLASS=BBB
REPORT=CCC
CONTROL=DDD

Here 
DEST=AAA		indicates the JES destination for the print on the remote system
CLASS=BBB		indicates the print class for the report on the remote system
REPORT=CCC		indicates the report title to be printed on the banner (max 21 characters). This is an optional parameter.
CONTROL=DDD		indicates printer carriage control codes in the report. Options are: NONE - no carriage control codes and ASA - standard carriage control codes.
FCB=EEE		indicates the FCB to be used by the JES system.
FORM=FFF		indicates the special form to be used for printing. 
Index

FTP

This document describes a few useful hints about FTP Step, which can be used for sending some file from mainframe region to some Unix server directly, using IP addresses.

Note: Turning on Line Numbers in columns 73-80 can cause problems. For example, in the line with the server host address, the line number in columns 73-80 is read by the FTP client program as the port number to be used in connecting to the ftp server. The port number should be allowed to default to port 21, unless otherwise specified by the server sysadmin. 

These job setups assume ascii file transfer. To transfer binary files, use the BINARY command prior to the PUT or GET command. 

The calling main program step is here:

//G2SS90PI JOB (ATBC-GNLDGRP,PROD),'NDM GEIS DRAFTS',
//         CLASS=B,MSGCLASS=J,NOTIFY=G2IOPCT
//JOBLIB   DD DSN=G2C000F.PROD.LOADLIB,DISP=SHR
//* Following is the FTP Step
//FTPSTEP1 EXEC PGM=FTP
//SYSPRINT DD SYSOUT=*
//OUTPUT   DD SYSOUT=*
//INPUT    DD DSN=G2SS00AP.FINSYS.PARMLIB(G2SS90PI),DISP=SHR
/*

Here the INPUT stands for the file where FTP instructions are coded. The INPUT file is here:

205.173.93.34
19730501@209.84.109.3
gkxx~l3"
cd \1973\05\01\pd\disbursement
put 'G2SS00AP.SS90.GEIS.DRAFTS(0)' g2ss00ap.gechk.txt
LOCSITE LR=lllll BLK=bbbbb REC=FB TR PRI=primary SEC=secondary U=ACADA 
get inputfile.dat 'G1SG00AT.TEST.FLATFILE' (replace
close
quit

Here 

205.173.93.34 - is the IP address of remote FTP server
19730501@209.84.109.3 - is username on remote server
gkxx~l3" - password on remote server
cd command specifies the directory where file is to be copied to/from
put ‘mainframe_source_file_name’ target_file_name

Here source file name is the data set name that is there in mainframe. You should first make certain that all MVS data sets to be ftp'ed to another server are not on the migration disks or tapes. The target file is the name of file that will get created from this source file, onto the target computer directly. Get command does the reverse, i.e. copies the file from UNIX to Mainframe data set. 

Do not specify a region on the EXEC statement. The batch proc requests 4M for the step - JCL that specifies less than 4M may fail. Be sure to observe case in remote server usernames, passwords and file descriptors. CD command is used to change directories on the remote server if your default login does not go to the directory containing the file you want to ftp to the MVS ftp server. 

For ASCII file transfers (raw data, program source, etc) the following parameters should be used in the LOCSITE command 
lllll is record length of the remote file. For variable length records, it is the length of the longest record + 4 bytes for the record-length descriptor word. 
bbbbb is the block-size of the MVS data set. For fixed length records, use the largest exact multiple of 'lllll' that does not exceed 28000. For variable-length records, (RECFM=VB or VBS, etc), use ????????????. 
Primary and secondary are spaces in tracks. 

For FTPing files to MVS, you can store data more efficiently by ignoring the NOTE about omitting BLKSIZE, and specifying a BLKSIZE that is the largest multiple of the LRECL <= 28000. Thus, the LOCSITE command would be: 

LOCSITE LR=400 BLK=28000 REC=FB TR PRI=363 SEC=37

Index

Important note:

The source file might be created within the same job in which FTP step is executed or some other job also can create this source file. In case it is a GDG, then precaution has to be taken while coding the GDG version.

Even if the GDG is getting created within the same job in which FTP step is executed, then also to refer to the current version of GDG (say the GDG version which is to be sent by FTP) within FTP step (here within INPUT file), version(0) is to be used and not version(+1).
 
Similarly if GDG is created within FTP step (+1), then also to refer to that GDG in later steps in the same JCL, we will be referring to the (0) version of the GDG.

This is because the FTP step can be treated as a different job although it is syntactically within the same job.
Index

REXEC

REXEC (REmote eXECution) is a protocol that allows the execution or a command or program on any host in the network. The local host receives the results of the command execution. This utility can be used to submit a script on a remote Unix machine from Mainframe. 

Note: The same can be done by using the RUN TASK command in NDM. But the significant advantage that REXEC offers is that it gives different codes according to the status of execution. Not only that REXEC can be executed from TSO prompt as well which gives much more flexibility in using this utility.

Below is the basic syntax for REXEC:

Usage: rexec  -? -d -l <usr> -p <pwd> -n -s <port> -t <fn> r_host cmd

Operands

-?		Returns a short help description
-D		traces the REXEC command at your host
-L USER	Specifies the the user ID on the remote host.  If you omit the user ID, REXEC checks for data set 'user_id.NETRC.DATA'. If not found, REXEC prompts you for the user ID.  Depending on the type of host, user ID may be case sensitive.
-P PASSWORD	Specifies the the password on the remote host.  If you omit the password under TSO, REXEC prompts you for a password. Depending on the type of host, password may be case sensitive.
-N	Forces the use of a user_id and password instead of going to data set user_id.NETRC.DATA.
-S PORT_NUMBER Specifies a port other than the default port of 512.
-T DSNAME	Specifies a translate table data set name. 
r_host 	Specifies either the name or internet address (in dotted decimal format) of the remote host where you want the command run.
cmd	Specifies the command that you want run on the remote host. The command can be composed of one or more words.  After checking for any prefixed parameters (-l, -p, and -s) and obtaining the remote host, REXEC uses the remaining argument string as the command.  Depending on the type of remote host, the command may be case sensitive.

Index

•	Execute ls command on Unix from TSO session

rexec -d -l applmgr -p applmgr 3.171.16.123 ls

Following is obtained as the output of this command (in ISPF panel only)

parms are -d -l applmgr -p ******* 3.171.16.123 ls
Variables have the following assignments:
fhost   : 3.171.16.123
userid  : applmgr
passwd  : *******
command : ls
MVS TCP/IP REXEC CS V2R8
calling GetHostResol with 3.171.16.123
Connecting to 3.171.16.123, port REXEC (512)
Passive Conn - OK on local port 2027
passive open complete on port 0
Active Conn - OK on local port 2028
active  open complete on port 1
getnextnote until DD
Connection state changed (8681)
Open (8673)
rexec invoked;
sending: 2027 applmgr ******* ls 
D2 len 24
returning from REXEC_UTIL
Connection state changed (8681)
Open (8673)
Data delivered (8682)
Bytes in 1
Connection state changed (8681)
Sending only (8675)
Connection state changed (8681)
Connection closing (8670)
Connection state changed (8681)
Nonexistent (8672)
Data delivered (8682)
Bytes in 1119
::3:.lst

<listing of all files on the default directory in Unix>

Connection state changed (8681)
Sending only (8675)
Connection state changed (8681)
Connection closing (8670)
Returning from recv_notices.
rexec complete
Index

•	Execute shell script on Unix from mainframe in batch mode

The following JCL to be used

//G2CPA2TJ JOB ' ',CLASS=Q,MSGCLASS=X,NOTIFY=&SYSUID
//*---------------------------------------------------------------------
//*    rexec command
//*---------------------------------------------------------------------
//REXEC001 EXEC PGM=REXEC,REGION=6M,
//         PARM='-l applmgr -p applmgr -n 3.171.16.123 rexec.sh &'
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSIN    DD SYSOUT=*

Here the shell script named rexec.sh is submitted on Unix.

Index
 
•	REXEC return codes

REXEC gives following return codes on execution

RC	SYSPRINT listing	Remarks	
00	No listing	Normal execution.	
00	ksh: trexec.sh:  not found	The script trexec.sh not found. However return code shows no errors.	
01	Login incorrect	Invalid user ID or password.	
36	Foreign host aborted the connection (8556)	Invalid IP address specified or server is down.	

Index

Appendix
•	Appendix I : Signed number to normal number conversion chart

Symbol	Value	
{	+0	
A	+1	
B	+2	
C	+3	
D	+4	
E	+5	
F	+6	
G	+7	
H	+8	
I	+9	
}	-0	
J	-1	
K	-2	
L	-3	
M	-4	
N	-5	
O	-6	
P	-7	
Q	-8	
R	-9	

The above table can be used to decode the actual value of the signed number. For example:

1.	Signed number : 123456E, value is : +123455

2.	Signed number : 12345L, value is : -123453
Index

•	
Appendix II : 3390 Device characteristics

Device Model	Model1	Model2	Model3	Model9	
Density	Single	Double	Triple	Mod9	
Tracks/Cylinders	15	15	15	15	
Tracks/Device	16695	33390	50085	150255	
Cylinders/Device	1113	2226	3339	10017	
Average seek time	9.5 ms	12.5 ms	15.0 ms	22.5 ms	
Bytes/Track	56664	56664	56664	56664	
Bytes/Cylinder	849960	849960	849960	849960	
Bytes/Device	946 MB	1.89 GB	2.84 GB	8.51 GB	
Bytes/Unit	3.78 GB	7.57 GB	11.34 GB	68.11 GB	

Index

•	
Appendix III : Computational items

A computational item is defined with one of the USAGE clause phrases described below.  A computational item is a value used in arithmetic operations.  It must be numeric.

If the USAGE of a group item is described with any of these items, the elementary items within the group have this usage.

The maximum length of a computational item is 18 decimal digits.

The PICTURE of a computational item can contain any of the following:

9    One or more numeric character positions
S    One operational sign
V    One implied decimal point
P    One or more decimal scaling positions

COMPUTATIONAL-1 and COMPUTATIONAL-2 items (internal floating-point) cannot  have PICTURE strings.

BINARY

Specified for binary data items.  Such items have a decimal equivalent consisting of the decimal digits 0 through 9, plus a sign.  Negative numbers are represented as the two's complement of the positive number with the same absolute value.

The amount of storage occupied by a binary item depends on the number of decimal digits defined in its PICTURE clause:

Digits in PICTURE Clause	Storage Occupied	
1 through 4	2 bytes (halfword)	
5 through 9	4 bytes (fullword)	
10 through 18	8 bytes (doubleword)	

The operational sign for binary data is contained in the left most bit of the binary data.

PACKED-DECIMAL

Specified for internal decimal items.  Such an item appears in storage in packed decimal format.  There are 2 digits for each character position, except for the trailing character position, which is occupied by the low-order digit and the sign.  Such an item can contain any of the digits 0 through 9, plus a sign, representing a value not exceeding 18 decimal digits.

The sign representation uses the same bit configuration as the 4-bit sign representation in zoned decimal fields.

COMPUTATIONAL or COMP (Binary)
This is the equivalent of BINARY.  The COMPUTATIONAL phrase is synonymous with BINARY.

COMPUTATIONAL-1 or COMP-1 (Floating-Point)
Specified for internal floating-point items (single precision). COMP-1 items are 4 bytes long.

COMPUTATIONAL-2 or COMP-2 (Long Floating-Point)
Specified for internal floating-point items (double precision). COMP-2 items are 8 bytes long.

COMPUTATIONAL-3 or COMP-3 (Internal Decimal)
This is the equivalent of PACKED-DECIMAL.

COMPUTATIONAL-4 or COMP-4 (Binary)
This is the equivalent of BINARY.

Conversion

(A)	COMP-3 ( Packed Decimal)

Formula -     (n / 2)  +1

PIC S9(09) Comp-3 - will take (9 / 2) + 1 = 5 bytes of storage

PIC S9(08) Comp-3 - will take (8 / 2) + 1 = 5 bytes of storage

(B)	COMP ( Binary )

Formula -   n / 2  

PIC S9(09) Comp - will take  9 / 2 = 4  bytes of storage

PIC S9(08) Comp - will take  8 / 2 = 4  bytes of storage

Index